【问题标题】:How to use splitview's pane in visualstate to achieve adaptive effect in UWP?UWP中如何在visualstate中使用splitview的pane实现自适应效果?
【发布时间】:2016-10-04 00:17:45
【问题描述】:

我在 StackPanel 中有一些导航按钮,我想将它们放在 splitview 的窗格中。当 splitview 的面板打开时,stackpanel 的方向是水平的,而当面板关闭时,stackpanel 的方向是垂直的,这样用户总是能够看到导航按钮。 XAML代码如下

             <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="PaneViewStates">
            <VisualState x:Name="PaneClosedState">
                <VisualState.StateTriggers>
                    <StateTrigger  IsActive="{Binding Path=IsPaneOpen, ElementName=SplitView, Converter={StaticResource BooleanNegationConverter}}"/>
                </VisualState.StateTriggers>
                <VisualState.Setters>
                    <Setter Target="NavigationControl.RootGrid.StackPanel.Orientation" Value="Vertical"/>
                </VisualState.Setters>
            </VisualState>
            <VisualState x:Name="PaneOpenState">
                <VisualState.StateTriggers>
                    <StateTrigger IsActive="{Binding Path=IsPaneOpen, ElementName=SplitView}"/>
                </VisualState.StateTriggers>
                <VisualState.Setters>
                    <Setter Target="NavigationControl.RootGrid.StackPanel.Orientation" Value="Horizontal"/>
                </VisualState.Setters>
            </VisualState>
        </VisualStateGroup>

但是我得到了像 The attachable property 'IsPaneOpen' was not found in type 'SplitView'. 这样的错误 我得到了飞机B,即使用OnPaneClosingOnPaneOpen之类的事件,但是只有PaneClosing事件,没有开幕事件。我想知道是否有人可以提出任何建议。

【问题讨论】:

  • 我认为您应该在这里使用 StateTrigger 而不是 AdaptiveTrigger,例如
  • @AndreyAshikhmin 仍然不会触发事件,无论窗格是打开还是关闭。我还测试了其他一些控件的可见性,以确保它不是 NavigationControl.RootGrid.StackPanel.Orientation 的问题
  • 尝试命名您的 StackPanel,f.e. 'AdaptiveStackPanel' 并将目标设置为:AdaptiveStackPanel.Orientation

标签: c# uwp windows-10-universal windows-10-mobile uwp-xaml


【解决方案1】:

自适应触发器使用MinWidthMinHeight 来检查触发条件。它不检查任何布尔条件。您需要使用StateTrigger 并将IsPaneOpen 绑定到IsActive 以触发“PaneOpenState”。但是如果要触发“PaneClosedState”,不能直接绑定到StateTriggerIsActive。你需要有一些从 StateTriggerBase 类派生的其他状态触发器,比如这些很棒的WindowsStateTriggers。我正在使用上述集合中的IsFalseStateTrigger

代码应该是这样的:

<Page ...
    xmlns:triggers="using:WindowsStateTriggers">
...

<VisualState x:Name="PaneOpenState">
    <VisualState.StateTriggers>
        <StateTrigger IsActive="{Binding IsPaneOpen, ElementName=MySplit}"/>
    </VisualState.StateTriggers>
    <VisualState.Setters>
        <Setter Target="NavigationControl.RootGrid.StackPanel.Orientation" Value="Horizontal"/>
    </VisualState.Setters>
</VisualState>
<VisualState x:Name="PaneClosedState">
    <VisualState.StateTriggers>
        <triggers:IsFalseStateTrigger Value="{Binding ElementName=MySplit, Path=IsPaneOpen}" />
    </VisualState.StateTriggers>
    <VisualState.Setters>
        <Setter Target="NavigationControl.RootGrid.StackPanel.Orientation" Value="Vertical"/>
    </VisualState.Setters>
</VisualState>

编辑

在我们的一位朋友指出之后,我才知道我忘记了使用IsFalseStateTrigger 的最明显方法。您可以使用像 NotTrueConverter 这样的转换器来否定布尔值并使用 StateTrigger 在“PaneClosedState”中使用它

【讨论】:

  • 难道你不能简单地对 PaneClosedState 使用某种 NegBoolean 转换器然后绑定它们吗?
  • @AndreyAshikhmin 很抱歉,我忘记了最明显的方法。我会编辑我的答案。谢谢:)
猜你喜欢
  • 2019-02-07
  • 2022-11-24
  • 2020-01-23
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 2020-04-21
相关资源
最近更新 更多