0

我正在开发一个文本编辑器,它的 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>
4

1 回答 1

0

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

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

于 2017-01-04T19:50:29.460 回答