2015-11-11 109 views
13

看來UWP XAML不支持樣式中的觸發器。什麼是常見的解決方法來完成如下的觸發器?UWP樣式觸發器丟失

<Style TargetType="Button"> 
    <Style.Triggers> 
     <Trigger Property="Visibility" Value="Collapsed"> 
      <Setter Property="Text" Value="" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

此刻,我看到下面的選項來完成觸發UWP:

使用動畫或VisualStateTriggers。如果我用它們不調整屏幕上的控件,兩者似乎都是錯誤的。


我想我找到了正確的方法來實現控件的一般觸發器。 請參見下面的代碼演示:

xmlns:Interactivity="using:Microsoft.Xaml.Interactivity" 
xmlns:Core="using:Microsoft.Xaml.Interactions.Core" 

<Border x:Name="BackgroundElement" Tag="Text"> 
    <Interactivity:Interaction.Behaviors> 
     <Core:DataTriggerBehavior Binding="{Binding Tag, ElementName=BackgroundElement}" Value="Text"> 
      <Core:ChangePropertyAction PropertyName="BorderBrush" Value="AliceBlue" /> 
     </Core:DataTriggerBehavior> 
    </Interactivity:Interaction.Behaviors> 
</Border> 

這將是真棒,如果有不的ElementName的解決方案。我會用AncestorType在WPF中做到這一點,但UWP中也缺少這一點。無論如何,你似乎不能在風格上使用Core:DataTriggerBehavior

+0

在UWP的應用程序,則必須使用[視覺狀態](https://msdn.microsoft.com/library/windows/apps /windows.ui.xaml.visualstatemanager.aspx)。 – Herdo

+0

查看創建自定義StateTrigger(從StateTriggerBase繼承),然後在可視狀態中使用它 –

回答

5

在WinRT中,RelativeSourceMode只支持TemplatedParent模式,FindAncestor不可用。因此,當您使用XAML Behaviors時,您需要使用ElementName作爲解決方法。如果您在項目中使用DataContext或ViewModel,則可以綁定到DataContext或ViewModel以避免使用ElementName。例如:

<Page ...> 
    <Page.Resources> 
     <local:MyViewModel x:Key="ViewModel" /> 
    </Page.Resources> 
    ... 
    <Border x:Name="BackgroundElement" DataContext="{Binding Source={StaticResource ViewModel}}"> 
     <Interactivity:Interaction.Behaviors> 
      <Core:DataTriggerBehavior Binding="{Binding Tag}" Value="Text"> 
       <Core:ChangePropertyAction PropertyName="Background" Value="Red" /> 
      </Core:DataTriggerBehavior> 
     </Interactivity:Interaction.Behaviors> 
    </Border> 
    ... 
</Page> 

而且視圖模型上面使用:

public class MyViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string _tag; 

    public string Tag 
    { 
     get 
     { 
      return _tag; 
     } 

     set 
     { 
      _tag = value; 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs("Tag")); 
      } 
     } 
    } 
}