2016-08-03 110 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

燁曾爲!非常感謝 –

相關問題