2012-01-09 11 views
5

WPFでコントロールのデリゲートリストフォームイベントを取得する方法。イベントの呼び出しリストを取得する方法

私は、人々はそれが可能ではないと言う理由を知らない私は、次のコードを試してみましたが、それがnullとして

TextBox cont = new TextBox(); 
cont.TextChanged += new TextChangedEventHandler(cont_TextChanged); 
FieldInfo fi = cont.GetType().GetField("TextChanged", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField | BindingFlags.Public | BindingFlags.Static); 
Delegate del = (Delegate)fi.GetValue(cont); 
+0

可能性のある複製[反射を使ってイベントの基になる代理人のリストを取得するにはどうすればいいですか?](http://stackoverflow.com/questions/6501288/how-can-i -get-a-below-delegate-from-an-event-using-reflection) – Heinzi

答えて

5

をフィールド情報を返します。

はあなたが一時的なすべてのイベントを無効にしたいとしましょう

:あなたはこのようにそれを呼び出すことができます

static Delegate[] DisableEvents(this Control ctrl, string eventName) 
{ 
     PropertyInfo propertyInfo = ctrl.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); 
     EventHandlerList eventHandlerList = propertyInfo.GetValue(ctrl, new object[] { }) as EventHandlerList; 
     FieldInfo fieldInfo = typeof(Control).GetField("Event"+eventName, BindingFlags.NonPublic | BindingFlags.Static); 

     object eventKey = fieldInfo.GetValue(ctrl); 
     var eventHandler = eventHandlerList[eventKey] as Delegate; 
     Delegate[] invocationList = eventHandler.GetInvocationList(); 
     foreach (EventHandler item in invocationList) 
     { 
      ctrl.GetType().GetEvent(eventName).RemoveEventHandler(ctrl, item); 
     } 
     return invocationList; 

}| 

:、あなたはこのようなメソッドを作成することができます

var events = textbox1.DisableEvents("GotFocus") 

もう一度追加したい場合は、イベントリストを確認するだけです。

+0

「イベントリストを通過する」という最終的な文章はどういう意味ですか? –

+0

私はあなたがDisableEventsメソッドで取得したリストを反復処理し、それらのイベントを再度追加できることを意味しました。しかし、実際にはこれを行う最も簡単な方法があり、GetInvocationListを呼び出してすべてのデリゲートを取得します。 –

+0

私のために働く!単純なControl.Clickイベントでテストされています。 +1 – Alex

0

前の回答に記載されているアプローチは完全に機能します。 しかし、これを使用するには、イベントがフィールドではなくプロパティとして実装されていることを確認する必要があります。同時に、デリゲートへの参照は、Dictionaryクラスの内部オブジェクトに格納されます。 もっと詳しく読むことができます:How to: Use a Dictionary to Store Event Instances (C# Programming Guide)

関連する問題