我正在使用文本编辑器,其UI将有两种状态:窄和宽。
Narrow主要用于低于<的窗口尺寸。 720px,以上时宽。但是,此外,如果只打开一个文件,我希望无论窗口大小如何,都要使用窄UI状态(即使它> s> = 720 px)。
我有一个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");
}
}
理想情况下,我会让它与2个州合作:
<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>
答案 0 :(得分:0)
你的setter应该为该属性引发PropertyChanged事件,否则状态触发器不知道它应该重新绑定。
即在您的界面上实现INotifyPropertyChanged,然后在setter调用中 PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(nameof(MoreThan1FileOpen)));