【问题标题】:Trigger a VisualState when the value of a bool property changes to true (and ignore when changes to false)当 bool 属性的值更改为 true 时触发 VisualState(更改为 false 时忽略)
【发布时间】:2017-05-19 05:00:17
【问题描述】:

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

理想情况下,我会让它在 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>

【问题讨论】:

    标签: xaml uwp uwp-xaml visualstatemanager visualstates


    【解决方案1】:

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

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

    【讨论】:

    • 实际上我刚刚意识到我正在将一个布尔值与一个整数进行比较!让我先解决这个问题..
    • 再次更新,不是最喜欢的解决方案,但至少是一个解决方案!
    猜你喜欢
    • 2014-07-01
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 2017-11-29
    • 2012-02-01
    • 2011-06-01
    相关资源
    最近更新 更多