你有没有尝试过VisualStateManager.GoToState
接受一个 Control、带有自定义状态名称的字符串和一个用于使用转换的布尔标志。
用法示例来自msdn
private void UpdateStates(bool useTransitions)
{
if (Value >= 0)
{
VisualStateManager.GoToState(this, "Positive", useTransitions);
}
else
{
VisualStateManager.GoToState(this, "Negative", useTransitions);
}
if (IsFocused)
{
VisualStateManager.GoToState(this, "Focused", useTransitions);
}
else
{
VisualStateManager.GoToState(this, "Unfocused", useTransitions);
}
}
稍微复杂一点的示例用法来自here
鉴于这个xaml
<Grid x:Name="LayoutRoot" Background="LightBlue">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="SG1">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="00:00:01">
<VisualTransition.GeneratedEasingFunction>
<ElasticEase EasingMode="EaseOut"/>
</VisualTransition.GeneratedEasingFunction>
</VisualTransition>
</VisualStateGroup.Transitions>
<VisualState x:Name="SG1Normal"/>
<VisualState x:Name="SG1EllipseRight" >
<Storyboard>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="ellipse" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
<EasingDoubleKeyFrame KeyTime="00:00:00" Value="320"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Ellipse x:Name="ellipse" Fill="Red" Stroke="Black"
Height="116" HorizontalAlignment="Left" Margin="50,98,0,0"
VerticalAlignment="Top" Width="235" RenderTransformOrigin="0.5,0.5" >
<Ellipse.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform/>
</TransformGroup>
</Ellipse.RenderTransform>
</Ellipse>
</Grid>
改变状态可以像这样完成。
VisualStateManager.GoToState(this, SG1EllipseRight.Name, true);
或者也可以
VisualStateManager.GoToState(control, "SG1EllipseRight", true);