我正在开发一个文本编辑器,它的 UI 将有两种状态:窄和宽。
Narrow 主要用于小于 720 像素的窗口大小,大于 720 像素时为宽。但是,此外,如果只打开一个文件,我希望使用窄 UI 状态而不管窗口大小(即,即使它 >= 720 像素)。
我有一个 bool 属性,可以记录是否打开了多个文件:
private bool _moreThan1FileOpen = false;
public bool MoreThan1FileOpen
{
get { return _moreThan1FileOpen; }
set
{
_moreThan1FileOpen = value;
}
}
但是我没有成功将 VisualState 触发器链接到此属性的值,即如果为 true,则转到此状态,如果为 false,则转到下一个 VisualState。
任何关于如何通过 VisualState.StateTriggers 实现这一目标的指导将不胜感激。
--
正如 dotMorten 所建议的,我已经更改了属性设置器以引发 PropertyChanged 事件以及一个 int 属性:
private bool _numFilesOpen = 0;
public bool NumFilesOpen
{
get { return _numFilesOpen; }
set
{
_numFilesOpen = value;
RaisePropertyChanged("NumFilesOpen");
}
}
理想情况下,我会让它在两种状态下工作:
<VisualState x:Name="WideState">
<VisualState.StateTriggers>
<triggers:CompositeStateTrigger Operator="And">
<triggers:CompareStateTrigger Value="{Binding NumFilesOpen}" CompareTo="1" Comparison="GreaterThan" />
<triggers:CompareStateTrigger Value="{Binding WindowWidth}" CompareTo="719" Comparison="GreaterThan" />
</VisualState.StateTriggers>
<VisualState x:Name="NarrowState">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="0" />
</VisualState.StateTriggers>
但是,复合状态触发器似乎不起作用,所以我最终得到了 3 个状态:
<VisualState x:Name="NarrowStatee">
<VisualState.StateTriggers>
<triggers:CompareStateTrigger Value="{Binding NumFilesOpen}" CompareTo="2" Comparison="LessThan" />
</VisualState.StateTriggers>
<VisualState x:Name="WideState">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="720" />
</VisualState.StateTriggers>
<VisualState x:Name="NarrowState">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="0" />
</VisualState.StateTriggers>