2015-11-11 46 views
13

UWP XAMLはスタイルのトリガをサポートしていないようです。次のようなトリガーを達成するための一般的な回避策は何ですか?UWPスタイルのトリガがありません

使用アニメーションやVisualStateTriggers:私はUWPでトリガを達成するために、以下のオプションを参照してください瞬間

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

。コントロールを画面に合わせないようにすると、どちらも間違っているようです。


私は、コントロールのための一般的なトリガーを実装する正しい方法を見つけたと思います。 はデモンストレーションとして、以下のコードを参照してください:

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を使用することはできないようです。 WinRTので

+0

、あなたはhttps://msdn.microsoft.com/library/windows/apps([表示状態]を使用する必要があります/windows.ui.xaml.visualstatemanager.aspx)。 – Herdo

+0

カスタムStateTrigger(StateTriggerBaseから継承)を作成し、それをビジュアルステート内で使用する方法を見てみましょう –

答えて

5

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> 

とViewModelに上記の使用:UWPアプリで

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")); 
      } 
     } 
    } 
} 
関連する問題