2012-01-12 9 views
0

すべてのキーダウンイベントを受け取るSilverlightコントロール(ChildWindow)があります。問題は、単にイベントがすべての子コントロールにルーティングされるため、私が単純に言うと、Silverlight 4コントロールレベルのキーイベント

this.KeyDown += new KeyEventHandler(EventDetailsPopup_UC_KeyDown) 

は動作しません。 UserControlまたはChildWindowレベルからKeyイベントまたはMouseイベントを受け取るにはどうすればよいですか?ありがとう

答えて

2

あなたは "それはうまくいかない"という意味を説明しませんが、私は少なくともあなたにいくつかの背景を与えることができます。

Silverlightはルーティングイベントの概念をサポートしています。ルーテッドイベントが子コントロールで起動されると、ルートビジュアルが満たされるまで、コントロールの親を起動し、次に親の親などを起動して、論理ツリーを上書きします。ルーティングされたイベントのリストはthis MSDN pageに詳述されています。これは、バブリングと呼ばれます。

子コントロールにこのイベントが表示されないようにしたいのですか?つまり、処理済みとして設定してキャンセルしたいとします。残念ながら、子コントロールが常に最初にイベントを受け取るため、これは不可能です。これをサポートするには、トンネリングという機能が必要です。ここでは、「プレビュー」イベントは、バブリングイベントが発生する前に親から子に最初にトンネルされます。上記のMSDNページで説明したWPF固有の機能です。

0

「仕事がない」とは、イベントを取得していないことを意味します。 一部の子要素がeventargumentsのHandledパラメータをtrueに設定している可能性があります。

しかし、あなたはまだコードで処理するイベントを聴くために登録することができますが、あなたのchildwindowのコンストラクタで言うことができます:

this.AddHandler(KeyDownEvent, (KeyEventHandler)YourHandlerFunction, true); 
+0

正しい、「機能しません」1のため、ルートコントロールがイベントを取得していないことを意味しその子供たちはそれを処理した。私は多くの子コントロールがメインコントロールにネストされているので、それぞれの子コントロールと各コンポーネントを処理し、それらを未処理として設定するとちょっと混乱します。ルートコントロールが子コントロールを知らなくてもこのイベントを受け取る方法があるかどうかは不思議です。ありがとう – user1145998