最良の伝搬VisualState変化
-
29-09-2019 - |
質問
私は現在、シナリオと私は迷う。
シナリオ:
- ControlAには、2つのカスタムvisualstatesましょう話StateOn"と"StateOff".
- 私は現在適用のテンプレートのControlAましょう"と呼んでいtemplateA".
- "templateA"の一制御下でのタイプControlB人の知らなかStateOn。
- ControlBは、テンプレート責任を負うものではありvisualstate変ControlA、StateOnとStateOff.
問題点:
ControlBを受けていませんので変更のVisualStatesに発砲しControlAることのない視覚の変化が起こる。
と思い、問題の根のある要素の制御(ControlB)な火gotostateを希望す。しかし、私から最もシンプル/クを伝播ControlAのvisualstate変更ControlB.
おります。
ヘンリー
ー:-
<UserControl x:Class="VisualStateChangePropagation.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:VisualStateChangePropagation"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<Grid x:Name="LayoutRoot" Background="White">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="20"/>
</Grid.ColumnDefinitions>
<Grid.Resources>
<SolidColorBrush x:Name="Fill_Bg_Red" Color="Red"/>
<SolidColorBrush x:Name="Fill_Bg_Blue" Color="Blue"/>
<ControlTemplate x:Name="templateA" TargetType="Control">
<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="Common">
<VisualState x:Name="StateOn">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="m_rect"
Storyboard.TargetProperty="(Rectangle.Fill)">
<DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource Fill_Bg_Red}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="StateOff"/>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Rectangle x:Name="m_rect" Fill="{StaticResource Fill_Bg_Blue}"/>
</Grid>
</ControlTemplate>
<ControlTemplate x:Name="templateB" TargetType="Control">
<local:ControlB Template="{StaticResource templateA}"/>
</ControlTemplate>
</Grid.Resources>
<local:ControlA x:Name="m_control1" Template="{StaticResource templateA}" Grid.Column="0"/>
<Button Click="Button_Click" Grid.Column="1" Content="swap"/>
<local:ControlA x:Name="m_control2" Template="{StaticResource templateB}" Grid.Column="2"/>
</Grid>
</UserControl>
コード:
public class ControlA : Control
{
public void ToggleState()
{
m_isSet = !m_isSet;
UpdateVisualState();
}
private void UpdateVisualState()
{
string targetState = m_isSet ? "StateOn" : "StateOff";
VisualStateManager.GoToState(this, targetState, false);
}
private bool m_isSet = false;
}
public class ControlB : Control
{
}
解決
まずは両ControlAとControlBい依存性 IsSet
.
public bool IsSet
{
get { return (bool)GetValue(IsSetProperty); }
set { SetValue(IsSetProperty, value); }
}
public static readonly DependencyProperty IsSetProperty =
DependencyProperty.Register(
"IsSet",
typeof(bool),
typeof(ControlA), //Change in ControlB
new PropertyMetadata(false, OnIsSetPropertyChanged));
private static void OnIsSetPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Control source = d as Control;
string newState = (bool)e.NewValue ? "StateOn" : "StateOff";
VisualStateManager.GotoState(source, newState, true);
}
に反してお勘視状態にな伝播します。国のみmeaningfullを制御する直接添付します。しかし、この依存性に追加の両方を制御では、今までの伝播のプロパティ値テンプレートによbinding:-
<ControlTemplate x:Name="templateB" TargetType="Control">
<local:ControlB Template="{StaticResource templateA}" IsSet="{TemplateBinding IsSet}" />
</ControlTemplate>
どをごControlAコードの m_isSet
分野長:-
public void ToggleState()
{
IsSet = !IsSet;
}
所属していません StackOverflow