2017-06-25 5 views
0

私はreflexionでbuttonclickを取得しようとしています。私はそれをCommandBindingに割り当てるための "Btn_AddTest_Click"文字列を取得したいと思います。たとえば :PropertyInfo button.GetPropertyイベントはnullを返します

XAML

<Button x:Name="Btn_Add" 
    Click="Btn_AddTest_Click"/> 

の後ろ

public async void Btn_AddTest_Click(object sender, RoutedEventArgs e) 
{...} 

と機能:

Type ObjType = Btn_Add.GetType(); 
PropertyInfo eventsProperty = ObjType.GetProperty("Events", BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic); 

EventHandlerList events = (EventHandlerList)eventsProperty.GetValue(Btn_Add, null); 

しかし、 "eventsProperty" i "がイベント" を試してみました、ヌルを返し、「EventClick "、クリック" ...同じ返信

私はこのことに触発されましたpost

+0

EDIT:プライベート非同期無効Btn_AddTest_Click(オブジェクト送信者、RoutedEventArgs e)の {...} – Alematt

答えて

1

ボタンのRoutedEventsを見る必要があると思います。

 var eventStore = Btn_Add 
      .GetType() 
      .GetProperty("EventHandlersStore", BindingFlags.Instance | BindingFlags.NonPublic) 
      .GetValue(Btn_Add, null); 

     var clickEvent = ((RoutedEventHandlerInfo[])eventStore 
      .GetType() 
      .GetMethod("GetRoutedEventHandlers", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) 
      .Invoke(eventStore, new object[] { Button.ClickEvent })) 
      .First(); 

そして、それを呼び出すために:

clickEvent.Handler.DynamicInvoke(null, null); 
+0

はとてもありがとうこれは、あなたClickルーティングイベントを取得します多くの場合、「clickEvent.Handler.Method.Name;」内に「Btn_AddTest_Click」がありますしかし、私はこれをCommandBindingのExecutedRoutedEventHandlerに変換することはできません。NewCommandBinding = new CommandBinding(NewCommand、Btn_AddTest_Click); – Alematt

+0

同じテーマではありませんでしたが、私はここで2番目の質問をしました。https://stackoverflow.com/questions/44760585/how-get-commandbinding-executed-from-routedeventhandlerinfo Lockdowne – Alematt

関連する問題