for WPF developers
Home Profile Tips 全記事一覧

ビヘイビアの作成

(2017/05/17 14:15:26 created.)

(2017/05/24 15:49:41 modified.)

コントロールに対するビヘイビアの一例をサンプルとして作成してみます。

IsEnabled 添付プロパティの変更イベントハンドラを次のように変更し、他のメソッドも追加します。

SampleBehavior.cs
  1. namespace Tips_Behavior.Views.Behaviors
  2. {
  3.     using System.Windows;
  4.     using System.Windows.Controls;
  5.  
  6.     /// <summary>
  7.     /// サンプルのビヘイビアを表します。
  8.     /// </summary>
  9.     public class SampleBehavior
  10.     {
  11.         /// <summary>
  12.         /// IsEnabled 添付プロパティの定義
  13.         /// </summary>
  14.         public static readonly DependencyProperty IsEnabledProperty = DependencyProperty.RegisterAttached("IsEnabled", typeof(bool), typeof(SampleBehavior), new PropertyMetadata(false, OnIsEnabledPropertyChanged));
  15.  
  16.         /// <summary>
  17.         /// IsEnabled 添付プロパティを取得します。
  18.         /// </summary>
  19.         /// <param name="target">対象とする DependencyObject を指定します。</param>
  20.         /// <returns>取得した値を返します。</returns>
  21.         public static bool GetIsEnabled(DependencyObject target)
  22.         {
  23.             return (bool)target.GetValue(IsEnabledProperty);
  24.         }
  25.  
  26.         /// <summary>
  27.         /// IsEnabled 添付プロパティを設定します。
  28.         /// </summary>
  29.         /// <param name="target">対象とする DependencyObject を指定します。</param>
  30.         /// <param name="value">設定する値を指定します。</param>
  31.         public static void SetIsEnabled(DependencyObject target, bool value)
  32.         {
  33.             target.SetValue(IsEnabledProperty, value);
  34.         }
  35.  
  36.         /// <summary>
  37.         /// IsEnabled 添付プロパティ変更イベントハンドラ
  38.         /// </summary>
  39.         /// <param name="sender">イベント発行元</param>
  40.         /// <param name="e">イベント引数</param>
  41.         private static void OnIsEnabledPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
  42.         {
  43.             var control = sender as Button;
  44.             if (control == null)
  45.                 return;
  46.  
  47.             var isEnabled = GetIsEnabled(control);
  48.             if (isEnabled)
  49.             {
  50.                 control.Click += OnClick;
  51.             }
  52.             else
  53.             {
  54.                 control.Click -= OnClick;
  55.             }
  56.         }
  57.  
  58.         /// <summary>
  59.         /// Click イベントハンドラ
  60.         /// </summary>
  61.         /// <param name="sender">イベント発行元</param>
  62.         /// <param name="e">イベント引数</param>
  63.         private static void OnClick(object sender, RoutedEventArgs e)
  64.         {
  65.             var control = sender as Button;
  66.             if (control == null)
  67.                 return;
  68.  
  69.             control.Content = "Don't touch me!";
  70.             control.IsEnabled = false;
  71.         }
  72.     }
  73. }

SampleBehavior.IsEnabled 添付プロパティは System.Windows.Button クラスに対して有効に機能するもので、IsEnabled 添付プロパティ値が true のとき、クリックイベントに登録したメソッドが処理されるようになっています。

このようなビヘイビアを定義してアプリケーションを実行すると次のようになります。

起動直後

ボタンを押した後

IsEnabled 添付プロパティが false であるボタンのほうは押しても何も起きませんが、true であるボタンは指定されたイベントハンドラが処理されていることがわかります。また、Button コントロールではないものに true が指定されていても無視されていることがわかります。