VisualStateManager中的UWP多个VisualState触发器

本文关键字:VisualState 触发器 多个 UWP 中的 VisualStateManager | 更新日期: 2023-09-27 18:27:43

我正在创建一个Windows通用应用程序

我想做3列组合的布局。每一列都显示不同的信息。

第一列包含ListView。如果选择一个项目,则应显示Second列。

第二列也包含ListView。如果选择了一个项目,则应显示第三个解决方案。

第三列中显示了一些信息。

我需要只显示列,显示一些信息(空白列隐藏)。此外,我想添加响应功能。因此,在移动设备上应该只显示一个优先级最高的列。

下面是一个例子

桌面(启动):

|1|

桌面(点击第一个ListView):

|1|2|

桌面(点击第二个ListView):

|1|2|3|

移动(启动):

|1|

桌面(点击第一个ListView):

|2|

桌面(点击第二个ListView):

|3|

因此,我想创建具有两个StateTriggers的VisualState

类似这样的东西:

<VisualState x:Name="VSShowThird">
    <VisualState.StateTriggers>
        <AdaptiveTrigger MinWindowWidth="750" />
        <StateTrigger IsActive="{Binding Path=ShowThirdColumn}" />
    </VisualState.StateTriggers>
    <VisualState.Setters>
        <Setter Target="FirstColumn.Visibility" Value="Visible" />
        <Setter Target="SecondColumn.Visibility" Value="Visible" />
        <Setter Target="ThirdColumn.Visibility" Value="Visible" />
    </VisualState.Setters>
</VisualState>
<VisualState x:Name="VSShowSecond">
    <VisualState.StateTriggers>
        <AdaptiveTrigger MinWindowWidth="750" />
        <StateTrigger IsActive="{Binding Path=ShowSecondColumn}" />
    </VisualState.StateTriggers>
    <VisualState.Setters>
        <Setter Target="FirstColumn.Visibility" Value="Visible" />
        <Setter Target="SecondColumn.Visibility" Value="Visible" />
        <Setter Target="ThirdColumn.Visibility" Value="Collapsed" />
    </VisualState.Setters>
</VisualState>
<VisualState x:Name="VSShowFirst">
    <VisualState.StateTriggers>
        <AdaptiveTrigger MinWindowWidth="750" />
    </VisualState.StateTriggers>
    <VisualState.Setters>
        <Setter Target="FirstColumn.Visibility" Value="Visible" />
        <Setter Target="SecondColumn.Visibility" Value="Collapsed" />
        <Setter Target="ThirdColumn.Visibility" Value="Collapsed" />
    </VisualState.Setters>
</VisualState>

但它不能正常工作。

你能给我什么解决办法吗?

非常感谢。

VisualStateManager中的UWP多个VisualState触发器

我创建这个触发器并创建

public class AdaptiveTriggerWithState : AdaptiveTrigger
{
    private double _minWindowHeightProperty;
    private double _minWindowWidthProperty;
    private const int INACTIVE_STATE_SIZE = 10000;
    public static DependencyProperty IsActiveProperty = 
        DependencyProperty.Register(
                                "IsActive", 
                                typeof(bool), 
                                typeof(AdaptiveTriggerWithState), 
                                new PropertyMetadata(default(bool), OnIsActive_Changed));
    private static void OnIsActive_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var instance = (AdaptiveTriggerWithState)d;
        instance.IsActive = (bool)e.NewValue;
    }
    public bool IsActive
    {
        get { return (bool)GetValue(IsActiveProperty); }
        set
        {
            SetValue(IsActiveProperty, value);
            SetValue(MinWindowHeightProperty, (IsActive ? this._minWindowHeightProperty : INACTIVE_STATE_SIZE));
            SetValue(MinWindowWidthProperty, (IsActive ? this._minWindowWidthProperty : INACTIVE_STATE_SIZE));
        }
    }
    public new System.Double MinWindowHeight
    {
        get { return (Double)GetValue(MinWindowHeightProperty); }
        set
        {
            this._minWindowHeightProperty = value;
            SetValue(MinWindowHeightProperty, (IsActive ? this._minWindowHeightProperty : INACTIVE_STATE_SIZE));
        }
    }
    public new System.Double MinWindowWidth
    {
        get { return (Double)GetValue(MinWindowWidthProperty); }
        set
        {
            this._minWindowWidthProperty = value;
            SetValue(MinWindowWidthProperty, (IsActive ? this._minWindowWidthProperty : INACTIVE_STATE_SIZE));
        }
    }

}