你必须通过使用该GoToStateAction行为或DataStateBehavior切换状态。
如果只是在2个状态之间切换,那么DataStateBehavior非常好。 如果你想在多个状态之间切换,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>
编辑: 确保您引用添加到混合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的解决方案,它完美的工作,没有任何代码背后。这就是为什么我要问,如果Code Behind在这种情况下是更清洁的解决方案还是交互触发器更好。对于这类问题,我的XAML/Wpf知识不够高。 – Febertson