Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

Style.TriggersとControlTemplate.Triggersの違い

エッセンシャル WPFより引用:

Buttonの既定のテンプレートが(境界線の背景を明示的に赤にすることにより)背景のテンプレートバインディングを削除するため、スタイルのトリガは何の影響も与えません。このような現象が起きる理由は、コントロールテンプレートが視覚ツリー要素のプロパティのみに影響を与えるのに対し、スタイルはコントロールのプロパティのみに影響を与えるからです。

Style.Triggers

アプリ実行
  • 起動

  • マウスオーバー

  • マウスクリック


ソースコード
  • App.xaml
<Application x:Class="HelloWorld.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
</Application>
  • MainWindow.xaml
<Window x:Class="HelloWorld.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="100" Width="150">
    <Window.Resources>
        <Style x:Key="{x:Type Button}" TargetType="{x:Type Button}">
            <Setter Property="Background" Value="Red" />       
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="Blue" />
                </Trigger>
                
                <!-- ボタンを押しても黄色にはならない -->
                <Trigger Property="IsPressed" Value="True">
                    <Setter Property="Background" Value="Yellow" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Button>Button</Button>
</Window>

ControlTemplate.Triggers

アプリ実行
  • 起動


  • マウスクリック


ソースコード
  • App.xaml
<Application x:Class="HelloWorld.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
</Application>
  • MainWindow.xaml
<Window x:Class="HelloWorld.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="100" Width="150">
    <Button>
        <Button.Template>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border Background="{TemplateBinding Background}" x:Name="border">
                    <ContentPresenter />
                </Border>
                <ControlTemplate.Triggers>
                    <!-- ボタンを押すと色が変わる -->
                    <Trigger Property="IsPressed" Value="True">
                        <Setter Property="Background" Value="Red" TargetName="border" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Button.Template>
        Button
    </Button>
</Window>