在设置另一个VisualState之后,如何维护VisualState触发器所做的更改
本文关键字:VisualState 触发器 维护 之后 另一个 设置 何维护 | 更新日期: 2023-09-27 18:24:13
不确定我的问题框架是否正确。所以,如果我期待一些荒谬的事情,请耐心等待。我正在按照MVVM模式构建一个C#/XAML win10 UWP应用程序。我已经定义了一些视觉状态来处理更宽的屏幕,也有一些用于运行一些动画。我面临的问题是,当使用VisualStateManager的GoToState方法调用运行动画的视觉状态时,由包含自适应触发器的VisualState影响的setter将丢失。这是示例代码:
//Defining my grid here
<Grid x:Name="gridNewDrawing" Margin="4">
<Button x:Name="Confirm" Click="Button_Confirm_Click" Width="180" MaxWidth="220" Height="36" HorizontalAlignment="Left" Style="StaticResource StyleButtonGeneral}"/>
<Button x:Name="Cancel" Click="Button_Cancel_Click" Width="180" MaxWidth="220" Height="36" HorizontalAlignment="Left" Style="StaticResource StyleButtonGeneral}"/>
</Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState x:Name="WideLayoutTrigger">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="640" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="gridNewDrawing.Margin" Value="16" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="AnimationState">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Cancel" Storyboard.TargetProperty="Visibility" Duration="0">
<DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
当宽度超过640px时;网格NewDrawing上的边距切换为16;但是当我使用显式调用动画时
GoToState("动画状态")
网格上的边距再次默认为4。在设置其他视觉样式时,有没有办法让adaptivetrigger所做的更改保持不变?
网格的边距再次更改为默认值,因为VisualState
位于相同的VisualStateGroup
中。您可以在另一个VisualStateGroup
中设置AnimationState
,以维护AdaptiveTrigger
所做的更改。
请参阅VisualStateGroup类的备注。
每个VisualStateGroup中的视觉状态集在该组中应该是互斥的。换句话说,控件应始终使用其定义的每个VisualStateGroup组中的一个视觉状态。无论何时,如果控件打算同时处于两个状态,请确保这两个状态处于不同的组中。
所以应用以下代码应该会得到你想要的:
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="WindowStates">
<VisualState x:Name="WideLayoutTrigger">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="640" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="gridNewDrawing.Margin" Value="16" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="OtherStates">
<VisualState x:Name="AnimationState">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="Cancel" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>