カスタムButtonクラスがあり、クリックされたとき(特定のウィンドウを開いたとき)に常に同じアクションを実行します。通常のボタンのように、ボタンのXAMLで割り当てることができるClickイベントを追加しています。
クリックされたら、Clickイベントハンドラーが割り当てられている場合は実行します。それ以外の場合は、デフォルトのアクションを実行します。問題は、ハンドラーがイベントに追加されているかどうかを確認する方法が明らかにないことです。
イベントのヌルチェックでそれができると思いました:
if (Click == null)
{
DefaultClickAction();
}
else
{
RaiseEvent(new RoutedEventArgs(ClickEvent, this));;
}
...しかし、それはコンパイルされません。コンパイラーは、定義クラスの内部でこのチェックを実行しようとしていますが、定義クラスの外部のイベントに対して+=または-=以外は実行できないことを通知します。
私は自分で正しい動作を実装しましたが、それは醜く冗長であり、これを行うための組み込みの方法がないことを信じることができません。私は何かが欠けているに違いありません。
関連するコードは次のとおりです。
public class MyButtonClass : Control
{
//...
public static readonly RoutedEvent ClickEvent =
EventManager.RegisterRoutedEvent("Click",
RoutingStrategy.Bubble,
typeof(RoutedEventHandler),
typeof(MyButtonClass));
public event RoutedEventHandler Click
{
add { ClickHandlerCount++; AddHandler(ClickEvent, value); }
remove { ClickHandlerCount--; RemoveHandler(ClickEvent, value); }
}
private int ClickHandlerCount = 0;
private Boolean ClickHandlerExists
{
get { return ClickHandlerCount > 0; }
}
//...
}