BehaviorやTriggerとActionを使用することで、簡単なロジックがRAD環境で構築できることがわかりました。ここでは、ありもののBehaviorを使うのではなく自作のBehaviorやTrigger/Actionを作成する方法について示します。Behaviorは、コードビハインドに何回も同じ処理を書いていた場合、作成するとよいことが多いです。では作成したみたいと思います。
Behaviorの自作
ここで作成するのは、ボタンをクリックするとHello worldと表示するBehaviorを自作したいと思います。 Behaviorを作成するために以下のアセンブリを参照に追加します。(Behaviorを使うときにはBlendが自動で追加していたものになります)
- System.Windows.Interactivity
- Microsoft.Expression.Interactions
バージョンは4.5のものを追加してください。
Behaviorの作成には、Behavior
using System; using System.Windows.Controls; using System.Windows.Interactivity; namespace BehaviorSample03 { [TypeConstraint(typeof(Button))] public class AlertBehavior : Behavior<Button> { } }
Behaviorは、対象に設定されたときに呼び出されるOnAttachedメソッドと、対象から外されるときに呼び出されるOnDetachingメソッドをオーバーライドして処理を作成していきます。今回は、OnAttachedメソッドでクリックイベントを購読して、OnDetachingメソッドでクリックイベントの購読を解除します。クリックイベントのイベントハンドラでは、MessageBoxを表示しています。
[TypeConstraint(typeof(Button))] public class AlertBehavior : Behavior<Button> { protected override void OnAttached() { // AssociatedObjectのイベントを購読する this.AssociatedObject.Click += this.ButtonClicked; } protected override void OnDetaching() { // イベントの購読解除 this.AssociatedObject.Click += this.ButtonClicked; } // イベントで処理をする private void ButtonClicked(object sender, System.Windows.RoutedEventArgs e) { MessageBox.Show("Hello world"); } }
ビルドすると、BlendでAlertBehaviorが使えるようになります。Buttonを画面に置いて、その上にAlertBehaviorをドロップします。
XAMLを以下に示します。
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:local="clr-namespace:BehaviorSample03" x:Class="BehaviorSample03.MainWindow" Title="MainWindow" Height="350" Width="525"> <Grid> <Button Content="Button" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="75"> <i:Interaction.Behaviors> <local:AlertBehavior/> </i:Interaction.Behaviors> </Button> </Grid> </Window>
実行してボタンをクリックすると、MessageBoxが表示されます。
TriggerとActionの自作
Triggerを作成するには、System.Windows.Interactivity名前空間のTriggerBase
using System.Windows;
using System.Windows.Controls;
using System.Windows.Interactivity;
namespace BehaviorSample04
{
[TypeConstraint(typeof(Button))]
public class ButtonClickTrigger : TriggerBase<Button>
{
protected override void OnAttached()
{
this.AssociatedObject.Click += this.ButtonClick;
}
private void ButtonClick(object sender, RoutedEventArgs e)
{
this.InvokeActions(e);
}
protected override void OnDetaching()
{
this.AssociatedObject.Click -= this.ButtonClick;
}
}
}
Actionは、TriggerAction
using System.Windows; using System.Windows.Controls; using System.Windows.Interactivity; namespace BehaviorSample04 { [TypeConstraint(typeof(Button))] [DefaultTrigger(typeof(Button), typeof(ButtonClickTrigger))] public class AlertAction : TriggerAction<Button> { protected override void Invoke(object parameter) { MessageBox.Show("Hello world"); } } }
画面にButtonを置いてAlertActionをドロップすると、以下のようなXAMLが生成されます。
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:local="clr-namespace:BehaviorSample04" x:Class="BehaviorSample04.MainWindow" Title="MainWindow" Height="350" Width="525"> <Grid> <Button Content="Button" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="75"> <i:Interaction.Triggers> <local:ButtonClickTrigger> <local:AlertAction/> </local:ButtonClickTrigger> </i:Interaction.Triggers> </Button> </Grid> </Window>
実行すると、Behaviorの時と同様にButtonをクリックするとMessageBoxが表示されます。
過去記事
- WPF4.5入門 その1 「はじめに」
- WPF4.5入門 その2 「WPFとは」
- WPF4.5入門 その3 「Hello world」
- WPF4.5入門 その4 「Mainメソッドはどこにいった?」
- WPF4.5入門 その5 「全てC#でHello world」
- WPF4.5入門 その6 「WPFを構成するものを考えてみる」
- WPF4.5入門 その7 「XAMLのオブジェクト要素と名前空間」
- WPF4.5入門 その8 「オブジェクト要素のプロパティ」
- WPF4.5入門 その9 「コレクション構文」
- WPF4.5入門 その10 「コンテンツ構文」
- WPF4.5入門 その11 「マークアップ拡張」
- WPF4.5入門 その12 「その他のXAMLの機能」
- WPF4.5入門 その13 「簡単なレイアウトを行うコントロール」
- WPF4.5入門 その14 「レイアウトコントロールのCanvasとStackPanel」
- WPF4.5入門 その15 「レイアウトコントロールのDockPanelとWrapPanel」
- WPF4.5入門 その16 「ViewBoxコントロール」
- WPF4.5入門 その17 「ScrollViewerコントロール」
- WPF4.5入門 その18 「Gridコントロール part 1」
- WPF4.5入門 その19 「Gridコントロール part 2」
- WPF4.5入門 その20 「レイアウトに影響を与えるプロパティ」
- WPF4.5入門 その21 「WPFのコンセプトと重要な機能つまみ食い」
- WPF4.5入門 その22 「Buttonコントロール」
- WPF4.5入門 その23 「DataGridコントロール その1」
- WPF4.5入門 その24 「DataGridコントロール その2」
- WPF4.5入門 その25 「TreeViewコントロール その1」
- WPF4.5入門 その26 「TreeViewコントロール その2」
- WPF4.5入門 その28 「Calendarコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その29 「ContextMenuコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その30「Menuコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その31 「ToolBarコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その32 「CheckBoxコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その33 「ComboBoxコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その34 「ListBoxコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その35 「RadioButtonコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その36 「Sliderコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その37 「TabControl」 - かずきのBlog@hatena
- WPF4.5入門 その38 「ファイルダイアログ」 - かずきのBlog@hatena
- WPF4.5入門 その39 「情報を表示するコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その40 「Popup、ToolTip、TextBox、Image、MediaElementコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その41 「DispatcherObject」 - かずきのBlog@hatena
- WPF4.5入門 その42 「WPFのプロパティシステム」 - かずきのBlog@hatena
- WPF4.5入門 その43 「読み取り専用の依存関係プロパティ」 - かずきのBlog@hatena
- 拡張されたプロパティメタデータ - かずきのBlog@hatena
- WPF4.5入門 その45 「添付プロパティ」 - かずきのBlog@hatena
- WPF4.5入門 その46 「WPFのイベントシステム」 - かずきのBlog@hatena
- WPF4.5入門 その47 「コンテンツモデル」 - かずきのBlog@hatena
- WPF4.5入門 その48 「WPFのアニメーション その1」 - かずきのBlog@hatena
- WPF4.5入門 その49 「WPFのアニメーション その2」 - かずきのBlog@hatena
- WPF4.5入門 その50 「Style」 - かずきのBlog@hatena
- WPF4.5入門 その51 「リソース」 - かずきのBlog@hatena
- WPF4.5入門 その52 「コントロールテンプレート」 - かずきのBlog@hatena
- WPF4.5入門 その53 「ユーザーコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その54 「カスタムコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その55 「Binding その1」 - かずきのBlog@hatena
- WPF4.5入門 その56「コレクションのバインディング」 - かずきのBlog@hatena
- WPF4.5入門 その57「コマンド」 - かずきのBlog@hatena
- WPF4.5入門 その58「Behavior」 - かずきのBlog@hatena