イベント処理はjsでよく書いていたし、
wpfでも「このボタンがクリックされたらこの処理が行われて〜」とかサクサク書いていたはずなのに、
いざ特定のobjectに対して同じような事を書こうとしたら
急に混乱して書けなかった。
(急にデリゲートとか出てきて??ってなった。)
よく考えたら、今までは用意されている
イベントハンドラを使っていただけで、
自分で
イベントハンドラを用意したことがなかったのが原因だった。
今回、
イベントハンドラの書き方について理解できたのでメモしておく。
イベントハンドラを用意する為に必要になるのは以下のとおりである。
・登録されるイベントリスナーに渡す引数の型の定義
・登録されるイベントリスナーの型の定義
・
イベントハンドラの定義
登録されるイベントリスナーに渡す引数の型の定義
jsで言えば、
var btn = document.getElementById('foo');
btn.addEventListener('click', function(e){
alert('foo');
}, false);
のeの部分。
イベントリスナー側に必要な値を渡すための型を定義しないといけない。
c# にはEventArgsというclassがあって、それで事足りるならそれをそのまま使えばいい。
独自になにか渡したい値があるなら、これを継承したclassを定義する。
class MyEventArgs : EventArgs{
public string message;
MyEventArgs(
sting message){
this.message = message;
}
}
登録されるイベントリスナーの型の定義
どんな引数をとって(ここでは先程定義したMyEventArgsをとる)
どんな結果を返す関数がイベントリスナーとして登録されるのかを定義する。
関数の型を定義するための仕組みがデリゲートである(と自分は認識した)
delegate void MyEventHandler(MyEventArgs e);
という感じで書く。(MyEventArgs型を引数として一つ受けとり、返り値はない)
他にもなにか渡したければ引数に追加してもよい。
最後にclassに
イベントハンドラを定義する。
さっき定義したデリゲートの型を使って
public event MyEventHandler MyEvent;
と書く。
これで、このobjectの外から、以下な感じでイベントリスナーを登録できる。
object.MyEvent += SomeFunction;
SomeFunctionの定義は以下な感じ。(MyEventHandlerとして定義した型に沿った関数になっている)
function void SomeFunction(MyEventArgs e){
//なんか処理
}
イベントリスナーの実行
イベントリスナーを実行するときには、イベントリスナーが存在することを確認してから実行する。
イベントリスナーが全く登録されていない場合nullとなっている。
if (this.MyEvent != null) {
this.MyEvent(new MyEventArgs("イベントリスナーを実行しました"))
}
wordpressでうまくコードを表示する
プラグインを探さないと。。