当bool属性的值更改为true时触发VisualState(并在更改为false时忽略)

时间:2017-01-04 19:20:32

标签: xaml uwp uwp-xaml visualstatemanager visualstates

我正在使用文本编辑器,其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>

1 个答案:

答案 0 :(得分:0)

你的setter应该为该属性引发PropertyChanged事件,否则状态触发器不知道它应该重新绑定。

即在您的界面上实现INotifyPropertyChanged,然后在setter调用中 PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(nameof(MoreThan1FileOpen)));