あなたはGoToStateActionの動作やDataStateBehaviorのいずれかを使用して状態を切り替える必要があります。
DataStateBehaviorは、2つの状態を切り替えるだけの場合に便利です。 複数の状態を切り替える場合は、GoToStateActionが便利です。
まず、DataStateBehaviorを使用した非常に簡単な例を示します。チェックボックスをクリックすると、矩形の色が切り替わります。
<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="MyStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:0.3"
To="Checked">
<VisualTransition.GeneratedEasingFunction>
<CubicEase EasingMode="EaseInOut" />
</VisualTransition.GeneratedEasingFunction>
</VisualTransition>
<VisualTransition GeneratedDuration="0:0:0.3"
To="Unchecked">
<VisualTransition.GeneratedEasingFunction>
<CubicEase EasingMode="EaseInOut" />
</VisualTransition.GeneratedEasingFunction>
</VisualTransition>
</VisualStateGroup.Transitions>
<VisualState x:Name="Checked">
<Storyboard>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)"
Storyboard.TargetName="myRect">
<EasingColorKeyFrame KeyTime="0"
Value="#FF6F6FFF" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Unchecked" />
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<i:Interaction.Behaviors>
<ei:DataStateBehavior Binding="{Binding IsChecked, ElementName=myCheckBox}"
Value="True"
TrueState="Checked"
FalseState="Unchecked" />
</i:Interaction.Behaviors>
<Rectangle x:Name="myRect"
Fill="#FFF4F4F5"
HorizontalAlignment="Left"
Margin="43.166,74.07,0,153.968"
Stroke="Black"
Width="104.438" />
<CheckBox x:Name="myCheckBox"
Content="CheckBox"
Height="20.776"
Margin="239.69,88.668,192.524,0"
VerticalAlignment="Top" />
</Grid>
次に、GoToStateActionを使用した例を示します。もう一度、チェックボックスをオンにして矩形の色を変更しています。
<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="MyStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:0.3"
To="Checked">
<VisualTransition.GeneratedEasingFunction>
<CubicEase EasingMode="EaseInOut" />
</VisualTransition.GeneratedEasingFunction>
</VisualTransition>
<VisualTransition GeneratedDuration="0:0:0.3"
To="Unchecked">
<VisualTransition.GeneratedEasingFunction>
<CubicEase EasingMode="EaseInOut" />
</VisualTransition.GeneratedEasingFunction>
</VisualTransition>
</VisualStateGroup.Transitions>
<VisualState x:Name="Checked">
<Storyboard>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)"
Storyboard.TargetName="myRect">
<EasingColorKeyFrame KeyTime="0"
Value="#FF6F6FFF" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Unchecked" />
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Rectangle x:Name="myRect"
Fill="#FFF4F4F5"
HorizontalAlignment="Left"
Margin="43.166,74.07,0,153.968"
Stroke="Black"
Width="104.438" />
<CheckBox x:Name="myCheckBox"
Content="CheckBox"
Height="20.776"
Margin="239.69,88.668,192.524,0"
VerticalAlignment="Top">
<i:Interaction.Triggers>
<ei:DataTrigger Binding="{Binding IsChecked, ElementName=myCheckBox}"
Value="True">
<ei:GoToStateAction StateName="Checked" />
</ei:DataTrigger>
<ei:DataTrigger Binding="{Binding IsChecked, ElementName=myCheckBox}"
Value="False">
<ei:GoToStateAction StateName="Unchecked" />
</ei:DataTrigger>
</i:Interaction.Triggers>
</CheckBox>
</Grid>
EDIT: あなたが動作するように、上記の方法のためのブレンドSDKへの参照を追加することを確認してください。
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
コードの背後にあるコードはきれいに見えます。このポイントで、私はあなたがクリーナーなのかどうか私に教えてくれるかどうか聞いてみたいと思います。コードビハインドまたは純粋なXAML(WBuckの答え) – Febertson
両方が必要です。 VisualStateはControlTemplateのXAMLマークアップで定義されており、VisualStateManager.GoToStateメソッドをコントロールクラスでプログラムで呼び出すと、コントロールが現在どの状態にあるかを判断できます。その特定の状態に対してGoToStateメソッドが呼び出されると、XAMLで定義したアニメーションが適用されます。 – mm8
私はWBuckのソリューションを試してみましたが、コードビハインドなしで完全に動作します。だからこそ私はコードビハインドがこのシナリオのよりクリーンなソリューションか、インタラクショントリガーが優れているかどうかを尋ねます。私のXAML/Wpfナレッジはこの種の質問には十分ではありません。 – Febertson