2016-08-03 33 views
0

我正在编写一个UWP应用程序如何在UWP应用程序中使用此自适应触发器

我加了SplitView(用于汉堡包的目的)到页面。

SPLITVIEW窗格,我有两个项目:

  • SellButtonGrid
  • SellButtonGridAlternate的上述两项取决于两个条件

能见度:

  • 最小520窗口高度
  • 和SplitViewPane已打开或关闭。

这意味着4箱子:

  1. 视窗高度大于520更小和splitviewpane关闭比520和splitviewpane开放

  2. 视窗高度大于520更大和

  3. 视窗高度较小splitviewpane已关闭

  4. 窗口高度大于52 0和splitviewpane开放

对于SPLITVIEW打开或关闭使用:

<VisualState x:Name="SplitViewOpen"> 
    <VisualState.StateTriggers> 
    <StateTrigger IsActive="{Binding ElementName=LayoutSplitView, 
    Path=IsPaneOpen}" /> 
    </VisualState.StateTriggers> 
    <VisualState.Setters> 
    <Setter Target="SellButtonGrid.Visibility" Value="Visible" /> 
    <Setter Target="SellButtonGridAlternate.Visibility" Value="Collapsed" /> 
    </VisualState.Setters> 
</VisualState> 
<VisualState x:Name="SplitViewClosed"> 
    <VisualState.StateTriggers> 
    <StateTrigger IsActive="{Binding ElementName=LayoutSplitView, 
    Path=IsPaneOpen, Converter={StaticResource BooleanNegationConverter}}" /> 
    </VisualState.StateTriggers> 
    <VisualState.Setters> 
    <Setter Target="SellButtonGrid.Visibility" Value="Collapsed" /> 
    <Setter Target="SellButtonGridAlternate.Visibility" Value="Visible" /> 
    </VisualState.Setters> 
</VisualState> 

为了检测低于或高于520高度我使用:

<VisualState x:Name="SmallHeight"> 
    <VisualState.StateTriggers> 
    <AdaptiveTrigger MinWindowHeight="0" /> 
    </VisualState.StateTriggers> 
    <VisualState.Setters> 
    <Setter Target="SellButtonGrid.Visibility" Value="Collapsed" /> 
    <Setter Target="SellButtonGridAlternate.Visibility" Value="Visible" /> 
    </VisualState.Setters> 
</VisualState> 
<VisualState x:Name="LargeHeight"> 
    <VisualState.StateTriggers> 
    <AdaptiveTrigger MinWindowHeight="520" /> 
    </VisualState.StateTriggers> 
    <VisualState.Setters> 
    <Setter Target="SellButtonGrid.Visibility" Value="Visible" /> 
    <Setter Target="SellButtonGridAlternate.Visibility" Value="Collapsed" /> 
    </VisualState.Setters> 
</VisualState> 

但结果并不是我所期望的。 如何合并这些视觉状态?

我试着使用: http://dotnetbyexample.blogspot.in/2016/02/an-adaptivetrigger-that-works-with.html

我使用上述解决方案,所以: 我重做代码:

xmlns:Utils="using:DellApp.Utils" 
xmlns:converters="using:DellApp.Converters" 
xmlns:windowsStateTriggers="using:WindowsStateTriggers" 

新创建的状态:

<VisualState.StateTriggers> 
    <windowsStateTriggers:CompositeStateTrigger> 
    <Utils:AdaptiveTrigger MinWindowHeight="520" MaxWindowHeight="18000" /> 

    <StateTrigger IsActive="{Binding ElementName=LayoutSplitView, 
    Path=IsPaneOpen, 
    Converter={StaticResource BooleanNegationConverter}}" /> 
    </windowsStateTriggers:CompositeStateTrigger> 
    </VisualState.StateTriggers> 
    <VisualState.Setters> 
    <Setter Target="SellButtonGrid.Visibility" Value="Collapsed" /> 
    <Setter Target="SellButtonGridAlternate.Visibility" Value="Visible" /> 
    </VisualState.Setters> 
</VisualState> 

<VisualState x:Name="SplitViewCollapsed_SmallHeight"> 
    <VisualState.StateTriggers> 
    <windowsStateTriggers:CompositeStateTrigger> 
    <Utils:AdaptiveTrigger MaxWindowHeight="519" 
    MinWindowHeight="0" /> 
    <StateTrigger IsActive="{Binding ElementName=LayoutSplitView, 
    Path=IsPaneOpen, 
    Converter={StaticResource BooleanNegationConverter}}" /> 
    </windowsStateTriggers:CompositeStateTrigger> 
    </VisualState.StateTriggers> 
    <VisualState.Setters> 
    <Setter Target="SellButtonGrid.Visibility" Value="Collapsed" /> 
    <Setter Target="SellButtonGridAlternate.Visibility" Value="Visible" /> 
    </VisualState.Setters> 
</VisualState> 

<VisualState x:Name="SplitViewOpen_SmallHeight"> 
    <VisualState.StateTriggers> 
    <windowsStateTriggers:CompositeStateTrigger> 
    <Utils:AdaptiveTrigger MaxWindowHeight="519" 
    MinWindowHeight="0" /> 
    <StateTrigger IsActive="{Binding ElementName=LayoutSplitView, 
    Path=IsPaneOpen}" /> 
    </windowsStateTriggers:CompositeStateTrigger> 
    </VisualState.StateTriggers> 
    <VisualState.Setters> 
    <Setter Target="SellButtonGrid.Visibility" Value="Collapsed" /> 
    <Setter Target="SellButtonGridAlternate.Visibility" Value="Visible" /> 
    </VisualState.Setters> 
</VisualState> 

<VisualState x:Name="SplitViewOpen_LargeHeight"> 
    <VisualState.StateTriggers> 
    <windowsStateTriggers:CompositeStateTrigger> 
    <Utils:AdaptiveTrigger MinWindowHeight="520" MaxWindowHeight="18000"/> 
    <StateTrigger IsActive="{Binding ElementName=LayoutSplitView, 
    Path=IsPaneOpen}" /> 
    </windowsStateTriggers:CompositeStateTrigger> 
    </VisualState.StateTriggers> 
    <VisualState.Setters> 
    <Setter Target="SellButtonGrid.Visibility" Value="Visible" /> 
    <Setter Target="SellButtonGridAlternate.Visibility" Value="Collapsed" /> 
    </VisualState.Setters> 
</VisualState> 

所以,我做的是我的广告代理CompositeStateTrigger from WindowsStateTriggers但我无法触发它。

回答

1

我从你的代码做了一个演示,并转载了这个问题。经过研究,我发现了以下问题:

  1. Binding不适用于StateTrigger。但x:Bind完美工作,所以你可以使用x:Bind,而不要忘记指定Mode=OneWayx:Bind
  2. Operator="And"需要指定windowsStateTriggers:CompositeStateTrigger

所以,你的XAML应该是固定的象下面这样:

<Page.Resources> 
    <converter:BooleanNegationConverter x:Name="BooleanNegationConverter" x:Key="BooleanNegationConverter"/> 
</Page.Resources> 

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup> 
      <VisualState> 
       <VisualState.StateTriggers> 
       <windowsStateTriggers:CompositeStateTrigger Operator="And">//use Operator='And' here 
         <Utils:AdaptiveTrigger MinWindowHeight="520" MaxWindowHeight="18000" /> 
         <StateTrigger IsActive="{x:Bind LayoutSplitView.IsPaneOpen,Mode=OneWay,Converter={StaticResource BooleanNegationConverter}}" /> 
       </windowsStateTriggers:CompositeStateTrigger> 
      </VisualState.StateTriggers> 
      <VisualState.Setters> 
       <Setter Target="SellButtonGrid.Visibility" Value="Collapsed" /> 
       <Setter Target="SellButtonGridAlternate.Visibility" Value="Visible" /> 
      </VisualState.Setters> 
      </VisualState> 

      <VisualState x:Name="SplitViewCollapsed_SmallHeight"> 
       <VisualState.StateTriggers> 
        <windowsStateTriggers:CompositeStateTrigger Operator="And"> 
         <Utils:AdaptiveTrigger MaxWindowHeight="519" MinWindowHeight="0" /> 
         <StateTrigger IsActive="{x:Bind LayoutSplitView.IsPaneOpen,Mode=OneWay,Converter={StaticResource BooleanNegationConverter}}" /> 
        </windowsStateTriggers:CompositeStateTrigger> 
       </VisualState.StateTriggers> 
       <VisualState.Setters> 
        <Setter Target="SellButtonGrid.Visibility" Value="Collapsed" /> 
        <Setter Target="SellButtonGridAlternate.Visibility" Value="Visible" /> 
       </VisualState.Setters> 
      </VisualState> 

      <VisualState x:Name="SplitViewOpen_SmallHeight"> 
       <VisualState.StateTriggers> 
        <windowsStateTriggers:CompositeStateTrigger Operator="And"> 
         <Utils:AdaptiveTrigger MaxWindowHeight="519" MinWindowHeight="0" /> 
         <StateTrigger IsActive="{x:Bind LayoutSplitView.IsPaneOpen}" /> 
        </windowsStateTriggers:CompositeStateTrigger> 
       </VisualState.StateTriggers> 
       <VisualState.Setters> 
        <Setter Target="SellButtonGrid.Visibility" Value="Collapsed" /> 
        <Setter Target="SellButtonGridAlternate.Visibility" Value="Visible" /> 
       </VisualState.Setters> 
      </VisualState> 

      <VisualState x:Name="SplitViewOpen_LargeHeight"> 
       <VisualState.StateTriggers> 
        <windowsStateTriggers:CompositeStateTrigger Operator="And"> 
         <Utils:AdaptiveTrigger MinWindowHeight="520" MaxWindowHeight="18000"/> 
         <StateTrigger IsActive="{x:Bind LayoutSplitView.IsPaneOpen}" /> 
        </windowsStateTriggers:CompositeStateTrigger> 
       </VisualState.StateTriggers> 
       <VisualState.Setters> 
        <Setter Target="SellButtonGrid.Visibility" Value="Visible" /> 
        <Setter Target="SellButtonGridAlternate.Visibility" Value="Collapsed" /> 
       </VisualState.Setters> 
      </VisualState> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 

这里是我做出的样品:AdaptiveTriggerSample

+0

烨曾为!非常感谢 –

相关问题