エッセンシャル 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>