背景:私は、WPFとC#(3.5)を使用していますし、ユーザーが既にコンパイル済みのアセンブリの一部だ形/ウィンドウ/ユーザーコントロールを表示することができますアプリに取り組んでいます。彼らはそれを見ると、コントロール(ボタン、テキストボックス、ラベルさえ)をクリックすることができるはずです。小さなポップアップエディタがコントロールによって表示され、そのコントロールのツールチップ、helpIDなどを入力する必要があります。反射によるルーティングイベントハンドラの削除?
長いとそれの短い:私は、WPFでの基本的なデザインビューを模倣する必要があります。これは、私は、少なくとも次の操作を行う必要があることを意味:
- 特定のアセンブリ(問題なし)からのUserControl /ウィンドウをロード
- ユーザーコントロール/ウィンドウ(問題なし)、それをインスタンス化
- そのすべてのコントロールのをすべてクリア加入のEventHandler
- 各制御に私自身の「ShowEditorPopup」のEventHandlerを割り当てます(問題になることはありません)
まず第一に誰が取るより簡単またはより良いルートの提案を持っている場合、私に知らせてください。 (明らかに、私は.NET 2が持っているように、WPFのためのDesignHostの種類のコンポーネントはありません)。
私は太字の項目に固執しています - 購読しているEventHandlersをクリアしています。いくつかの掘り起こしとリフレクターに入ると、私はこのクールな危険なコードを思いつきました(ここでは、XAMLで定義されているsomeButtonという単一のButtonのすべてのEventHandlerを取得しようとしています)。
<Button Name="someButton" Click="someButton_Click"/>
ここで
は(あなたがしたい場合は、someButton_ClickなeventHandlerからそれを実行することができます)コードです:
public void SomeFunction()
{
// Get the control's Type
Type someButtonType = ((UIElement)someButton).GetType();
// Dig out the undocumented (yes, I know, it's risky) EventHandlerStore
// from the control's Type
PropertyInfo EventHandlersStoreType =
someButtonType.GetProperty("EventHandlersStore",
BindingFlags.Instance | BindingFlags.NonPublic);
// Get the actual "value" of the store, not just the reflected PropertyInfo
Object EventHandlersStore = EventHandlersStoreType.GetValue(someButton, null);
// Get the store's type ...
Type storeType = EventHandlersStore.GetType();
// ... so we can pull out the store's public method GetRoutedEventHandlers
MethodInfo GetEventHandlers =
storeType.GetMethod("GetRoutedEventHandlers",
BindingFlags.Instance | BindingFlags.Public);
// Reflector shows us that the method's sig is this:
// public RoutedEventHandlerInfo[] GetRoutedEventHandlers(RoutedEvent routedEvent);
// So set up the RoutedEvent param
object[] Params = new object[] { ButtonBase.ClickEvent as RoutedEvent };
// I've also seen this for the param, but doesn't seem to make a difference:
// object[] Params = new object[] { someButton.ClickEvent };
// And invoke it ... and watch it crash!
GetEventHandlers.Invoke(someButton, Params);
}
それを返す呼び出し、最大動作します:オブジェクトがターゲット・タイプ(つまり、私のparamsや目標と一致していませんオブジェクトが混乱している)。
私はGetEventHandlers METHODINFOに時計を設定GetEventHandlers.Invoke(Activator.CreateInstance(someButton.GetType()), Params);
// Also doesn't work...
、それは偉大に見える、それはちょうど私が呼び出しを呼び出すとき、私はそれを渡しているものを好きではない:私はあなたがこの問題を解決することができます発見しました。
RoutedEventハンドラのリストを取得する方法の最後のステップであるようです(明らかにWPF RoutedEventsでは正常に動作しないGetInvocationList()など)。そこから、各コントロールからこれらのハンドラを削除し、無事にフォームを作成するだけで、自分のイベントを追加することができます。
手がかりはありますか?繰り返しますが、タスク全体をより簡単に行う方法があれば、私に教えてください:)
を、私はちょうど同じことをしようとしていた、素晴らしい仕事をしました。あなたは私に必要な出発点を与えました。 – orellabac