在设置另一个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之后,如何维护VisualState触发器所做的更改

网格的边距再次更改为默认值,因为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>