在设置另一个 VisualState 后如何维护 VisualState 触发器所做的更改?
How do you maintain changes made by VisualState triggers after setting another VisualState?
不确定我是否正确地提出了问题。所以如果我期待一些荒谬的事情,请多多包涵。我正在按照 MVVM 模式构建 C#/XAML win10 UWP 应用程序。
我定义了一些用于处理更宽屏幕的视觉状态,还有一些用于 运行 一些动画。面临的问题是,当使用 VisualStateManager 的 GoToState 方法调用动画 运行 的视觉状态时,包含自适应触发器的 VisualState 所影响的设置器将丢失。
这是示例代码:
//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时; gridNewDrawing 上的边距切换为 16;但是当我使用
显式调用动画时
GoToState("AnimationState")
网格上的边距再次默认为 4。有什么方法可以让 adaptivetrigger 所做的更改在设置其他视觉样式时保持不变?
网格的边距再次更改为默认值,因为您的 VisualState
在同一个 VisualStateGroup
中。您可以在另一个 VisualStateGroup
中设置 AnimationState
以保持 AdaptiveTrigger
.
所做的更改
参见VisualStateGroup class的备注。
The set of visual states within each VisualStateGroup should be mutually exclusive in the group. In other words, the control should be using exactly one of the visual states from each of its defined VisualStateGroup groups at all times. Whenever there's a case where a control is intended to be simultaneously in two states, make sure that the two states are in different groups.
所以应用下面的代码应该得到你想要的:
<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>
不确定我是否正确地提出了问题。所以如果我期待一些荒谬的事情,请多多包涵。我正在按照 MVVM 模式构建 C#/XAML win10 UWP 应用程序。 我定义了一些用于处理更宽屏幕的视觉状态,还有一些用于 运行 一些动画。面临的问题是,当使用 VisualStateManager 的 GoToState 方法调用动画 运行 的视觉状态时,包含自适应触发器的 VisualState 所影响的设置器将丢失。 这是示例代码:
//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时; gridNewDrawing 上的边距切换为 16;但是当我使用
显式调用动画时GoToState("AnimationState")
网格上的边距再次默认为 4。有什么方法可以让 adaptivetrigger 所做的更改在设置其他视觉样式时保持不变?
网格的边距再次更改为默认值,因为您的 VisualState
在同一个 VisualStateGroup
中。您可以在另一个 VisualStateGroup
中设置 AnimationState
以保持 AdaptiveTrigger
.
参见VisualStateGroup class的备注。
The set of visual states within each VisualStateGroup should be mutually exclusive in the group. In other words, the control should be using exactly one of the visual states from each of its defined VisualStateGroup groups at all times. Whenever there's a case where a control is intended to be simultaneously in two states, make sure that the two states are in different groups.
所以应用下面的代码应该得到你想要的:
<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>