如何在visualstate中使用splitview的窗格来实现UWP中的自适应效果?

时间:2016-06-03 20:17:53

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

我在StackPanel中有一些导航按钮,我想将它们放在splitview的窗格中。当splitview的窗格打开时,堆栈面板的方向是水平的,当窗格关闭时,堆栈面板的方向是垂直的,这样用户总是能够看到导航按钮。 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>

但是我收到了像可附加属性'IsPaneOpen' was not found in type 'SplitView'.这样的错误 我得到了平面B,即使用OnPaneClosingOnPaneOpen等事件,但是只有PaneClosing事件,没有开放事件。我想知道是否有人可以提出任何建议。

1 个答案:

答案 0 :(得分:1)

自适应触发器使用MinWidthMinHeight来检查触发条件。它不会检查任何布尔条件。您需要使用StateTrigger并将IsPaneOpen绑定到IsActive以触发&#34; PaneOpenState&#34;。但是,如果您想触发&#34; PaneClosedState&#34;,则无法直接将其绑定到IsActive的{​​{1}}。你需要有一些从StateTriggerBase类派生的其他状态触发器,就像这些令人敬畏的WindowsStateTriggers一样。我正在使用上述集合中的StateTrigger

代码应该是:

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这样的转换器来否定布尔值并在&#34; PaneClosedState&#34;中使用它。使用NotTrueConverter