WPFスタイルトリガ


フリップフロップ
1.属性トリガー
ある属性に特定の値がある場合、属性トリガはSetterを実行します.属性がこの値を失うと、属性トリガはSetterをやり直します.
<StackPanel.Resources>
    <!--  Style  -->
    <Style x:Key="buttonStyle" TargetType="{x:Type Button}">
        <Style.Triggers>
            <!--   -->
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="RenderTransform">
                    <Setter.Value>
                        <RotateTransform Angle="10"/>
                    </Setter.Value>
                </Setter>
                <Setter Property="Foreground" Value="Black"/>
            </Trigger>
        </Style.Triggers>
        <!--   -->
        <Setter Property="Width" Value="50"/>
        <Setter Property="Height" Value="50"/>
        <Setter Property="Foreground" Value="White"/>
        <Setter Property="Background" Value="BurlyWood"/>
    </Style>
            
    <!--  Style  -->
    <Style x:Key="textBoxStyle" TargetType="{x:Type TextBox}">
        <Style.Triggers>
            <!--   -->
            <Trigger Property="Validation.HasError" Value="True">
                <Setter Property="Background" Value="Red"/>
                <!--  RelativeSource ErrorContent -->
                <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},
                    Path=(Validation.Errors)[0].ErrorContent}"/>
            </Trigger>
        </Style.Triggers>
        <!--   -->
        <Setter Property="Background" Value="Azure"/>
    </Style>
</StackPanel.Resources>

<Button Name="but" Style="{StaticResource buttonStyle}">Button</Button>
<TextBox Name="txt" Style="{StaticResource textBoxStyle}">
    <TextBox.Text>
        <Binding ElementName="but" Path="Content">
            <!--   -->
            <Binding.ValidationRules>
                <local:JpgValidation/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

2.データトリガー
同じ属性のフリップフロップであるが、データフリップフロップは任意である.NET属性は、依存属性のみによってトリガされるのではなく、予期せぬ事故をトリガーします.
<StackPanel.Resources>
    <Style x:Key="textBoxStyle" TargetType="{x:Type TextBox}">
        <Style.Triggers>
            <!--  disabled ,  -->
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text}" Value="disabled">
                <Setter Property="IsEnabled" Value="False"/>
            </DataTrigger>
        </Style.Triggers>
        <!--   -->
        <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=Text}"/>
    </Style>
</StackPanel.Resources>

3.イベントトリガー
建設中...
 
4.より複雑な論理をフリップフロップで表す
<StackPanel.Resources>            
    <Style x:Key="textBoxStyle2" TargetType="{x:Type TextBox}">
        <Style.Triggers>
            <!--  , ,  -->
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Foreground" Value="Red"/>
            </Trigger>
            <Trigger Property="IsFocused" Value="True">
                <Setter Property="Foreground" Value="Red"/>
            </Trigger>
                    
            <!-- Trigger  -->
            <MultiTrigger>
                <!--  , ,  -->
                <MultiTrigger.Conditions>
                    <Condition Property="IsMouseOver" Value="True"/>
                    <Condition Property="IsFocused" Value="True"/>
                </MultiTrigger.Conditions>
                <Setter Property="Background" Value="Green"/>
            </MultiTrigger>
        </Style.Triggers>
    </Style>
</StackPanel.Resources>