サーチ…
前書き
Trigger
、 DataTrigger
、 MultiTrigger
、 MultiDataTrigger
、およびEventTrigger
を含む、WPFで利用可能なさまざまな種類のトリガについての議論。
トリガーでは、 FrameworkElement
またはFrameworkContentElement
から派生したクラスによって、トリガーで定義された特定の条件に基づいてプロパティを設定または変更できます。基本的に、要素のスタイルを設定することができれば、同様にトリガすることができます。
備考
-
EventTrigger
を除くすべてのトリガーは、<Style>
要素内で定義する必要があります。EventTrigger
は、<Style>
要素またはコントロールのTriggers
プロパティで定義できます。 -
<Trigger>
要素には、任意の数の<Setter>
要素を含めることができます。これらの要素は、<Trigger>
要素の条件が満たされたときに、包含要素のプロパティを設定します。 - ルート要素のマークアップでプロパティが定義されている場合、トリガ条件が満たされていても、
<Setter>
要素で定義されたプロパティの変更は有効になりません。<TextBlock Text="Sample">
というマークアップを考えてみましょう。ルートプロパティ定義はスタイルで定義されたプロパティよりも優先されるため、進行中のコードのText
プロパティはトリガに基づいて決して変更されません。 - バインディングと同様に、いったんトリガが使用されると、トリガは変更できません。
引き金
Trigger
は、5つのトリガタイプの中で最も簡単なもので、同じコントロール内の他のプロパティに基づいてプロパティを設定します。
<TextBlock>
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="Text" Value="Pass">
<Setter Property="Foreground" Value="Green"/>
</Trigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
この例では、 Text
プロパティが文字列"Pass"
と等しい場合、 TextBlock
前景色が緑色に変わります。
マルチトリガー
MultiTrigger
は、同じコントロール内のプロパティにのみ適用されるという点で、標準のTrigger
に似ています。違いは、 MultiTrigger
は、トリガーが動作する前に満たされなければならない複数の条件があることです。条件は、 <Condition>
タグを使用して定義されます。
<TextBlock x:Name="_txtBlock" IsEnabled="False">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Text" Value="Pass"/>
<Condition Property="IsEnabled" Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="Foreground" Value="Green"/>
</MultiTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
両方の条件が満たされるまで、 MultiTrigger
はアクティブにならないことに注意してMultiTrigger
。
DataTrigger
DataTrigger
は、独自のコントロール、別のコントロール、または非UIクラスのプロパティであれ、任意のプロパティにアタッチすることができます。次の単純なクラスを考えてみましょう。
public class Cheese
{
public string Name { get; set; }
public double Age { get; set; }
public int StinkLevel { get; set; }
}
次のTextBlock
DataContext
として添付します。
<TextBlock Text="{Binding Name}">
<TextBlock.DataContext>
<local:Cheese Age="12" StinkLevel="100" Name="Limburger"/>
</TextBlock.DataContext>
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding StinkLevel}" Value="100">
<Setter Property="Foreground" Value="Green"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
前のコードでは、 TextBlock.Foreground
プロパティはGreenになります。我々は変更する場合StinkLevel
100以外に、当社のXAMLでプロパティを、 Text.Foreground
プロパティは、それのデフォルト値に戻ります。