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>
但它不能正常工作。
你能给我什么解决办法吗?
非常感谢。
我创建这个触发器并创建
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));
}
}
}