9月
26
HTML + CSS だとマウスオーバーで色が変わるハイパーリンクはスクリプトを使わずとも CSS だけで書けるわけですが、それと同様のことを WPF でやる話。
ちなみに HTML + CSS の場合は以下の通り。
a:link { color: blue; } a:hover { color: red; }
他にも a:visited とか a:active とかあるだろうけど気にしない。
さて本題。
コントロール自身のプロパティを元に他のプロパティ等を変更するには Trigger というものを使います。ただし、Button クラスの(より正確には FrameworkElement クラスの) Triggers プロパティに指定できるのは EventTrigger だけなので、スタイルやテンプレートを経由して設定する必要があります(EventTrigger でも書けないことはないけど Trigger を使った方が簡潔)。結果としてこんな感じ。
<Window x:Class="MouseOverButtonTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="128" Width="192"> <StackPanel VerticalAlignment="Center"> <Button Content="Button"> <Button.Style> <Style TargetType="Button"> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Foreground" Value="Red"/> </Trigger> </Style.Triggers> </Style> </Button.Style> </Button> </StackPanel> </Window>
なお、マウスオーバーしていない時の色を別途指定したい場合は、スタイルの中に Setter を書く必要があります。Button 要素の属性として書いてしまうと、スタイルに書いたトリガーで起動される当該プロパティに対する Setter は効かなくなります。
<Window x:Class="MouseOverButtonTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="128" Width="192"> <StackPanel VerticalAlignment="Center"> <!-- こっちは意図した結果にならない --> <Button Content="Bad!!" Foreground="Blue"> <Button.Style> <Style TargetType="Button"> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Foreground" Value="Red"/> </Trigger> </Style.Triggers> </Style> </Button.Style> </Button> <!-- こっちはOK --> <Button Content="Good!!"> <Button.Style> <Style TargetType="Button"> <Setter Property="Foreground" Value="Blue"/> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Foreground" Value="Red"/> </Trigger> </Style.Triggers> </Style> </Button.Style> </Button> </StackPanel> </Window>
もちろん、依存関係プロパティであれば何でも変更可能なわけで、変更するプロパティとして Opacity を指定すると、平常時は透明でマウスオーバーすると見えるようになるボタンとか作れます(私が元々これを調べているときにやりたかったのはこれ)。ただこれ、マウスを使わずキーボードだけでボタンを操作する場合は透明なままになってしまうので、もうちょっと考えないといけない気がします。
no comment untill now