(XAML#08)「イベントを設定するための EventSetter」
昨日に続いてスタイルについてのトピックです。Styleは、「スタイル」という言葉から「外観をどのように表示するか」という用途を思い浮かべてしまうかもしれませんが、昨日紹介したようにスタイルで設定できるものは外観に関係するかどうかに関係なく、プロパティ(厳密には添付プロパティ)が対象となります。そして、スタイルでは「イベント」も設定できます。このために使うのが「EventSetter」です。
EventSetter の使い方は、プロパティを設定するために使う Setter と同じようなものですが、プロパティを設定する「Property プロパティ」の代わりに、「Event プロパティ」にイベントを設定し、値を設定する「Value プロパティ」の代わりに、「Handler プロパティ」にイベントハンドラの名称を設定します。たとえば、次のように定義できます。
[XAML]
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="325" Width="525">
<Window.Resources>
<Style TargetType="{x:Type Button}">
<!-- すべての Button の Foreground プロパティを "Red" にする -->
<Setter Property="Foreground" Value="Red" />
<!-- すべての Button の Click イベントに ButtonClick イベントハンドラーを割り当てる -->
<EventSetter Event="Click" Handler="ButtonClick" />
</Style>
</Window.Resources>
<StackPanel>
<Button Content="One" />
<Button Content="Two" />
<Button Content="Three" />
</StackPanel>
</Window>
[コード]
private void ButtonClick(object sender, RoutedEventArgs e)
{
var btn = sender as Button;
if (btn != null)
MessageBox.Show(btn.Content.ToString());
}
キー(x:Key)を使ってスタイルを適用するコントロールを限定したり、BasedOn を使って基になるスタイルを設定できるのは昨日と同じです。実際には、Click のような処理は6日目に紹介したコマンド(Command)を使う方がよいことも多いのですが、EventSetter では、すべてのイベントを対象にできるため、コントロールに対して共通処理を割り当てるような場合には便利に使えます。