0

ルーティングされたイベントを把握しているところなので、簡単な質問です。

私はカスタムを持っていますUserControl。これには他の多くのコントロールが含まれています。

ツリーのさらに上にある、含まれているコントロールの1つ(myではない)から発生するダブルクリックイベントに応答したいと思いますUserControl。ただし、私UserControlは明らかにイベントをキャッチし、sourceプロパティをそれ自体に設定しています。どうすればこれをやめることができますか?

これはクリックされた最低レベルのコントロール(またはその他)OriginalSourceを指しているため、使用できません。Border

例えば。

MyWindow <--- Want to handle double click here with Source = MyContainedControl1
 |
 +-MyUserControl (this is setting Source to itself. How do I turn this off?)
    |
    +-MyContainedControl1 
       |
       Border    <---- Mouse double clicks here
       EditBox
       Etc

OnMouseDoubleClick()オーバーライドしてOnPreviewMouseDoubleClick()inを試しましMyUserControlたが、この時点で、MyUserControlbaseなどを呼び出す前でも、イベントのSourceはすでに設定されています。

どうもありがとう

4

4 に答える 4

1

次のようにビジュアル ツリーをたどります。

        private void Window_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            var control = FindVisualParent<MyContainedControl1>(e.OriginalSource as DependencyObject);
            if (control != null)
            {
                //magic happens here
            }
        }

        public static T FindVisualParent<T>(DependencyObject child) where T : DependencyObject
        {
            var parent = VisualTreeHelper.GetParent(child);
            if (parent == null) 
                return null;
            T pT = parent as T;
            return pT != null ? pT : FindVisualParent<T>(parent);
        }
于 2012-09-27T13:01:03.980 に答える
0

代わりにmyUserControlを aに変更することで、なんとか修正できました。ContentControl幸いなことに、コンテンツはすべて実行時に動的に読み込まれるため、UserControl提供されるデザイン タイム サーフェスは必要ありません。多くの検索にもかかわらず、WPF Unleashed 内の 1 つの文を除いて、イベントに対する UserControl の影響については何も見つかりませんでした (722 ページ)

これは、UserControl がその ContentControl 基本クラスとほとんど変わらないためです。異なる既定のコントロール テンプレートを持ち、(左と上ではなく) 両方向に Stretch の既定のコンテンツ配置を持ち、既定で IsTabStop と Focusable を false に設定し、 内部コンテンツから発生するすべてのイベントのソースをUserControl 自体になります

また、MouseDoubleClick は実際のバブリング イベントではないため、PreviewMouseDownではなくusing に変更する必要がありました。Control.MouseDoubleClickMouseDoubleClickを参照してください。

このルーティング イベントは、要素ツリーを介してバブリング ルートに従っているように見えますが、実際には、各 UIElement によって要素ツリーに沿って発生する直接ルーティング イベントです。

が必要だった場合はUserControl、Klaus78 が提案するようにして、ContainedControl で独自のカスタム イベントを発生させるか、各 ContainedControl のダブルクリック イベントをバブルアップさせるのではなく、手動でサブスクライブする必要があったと思います。

于 2012-09-27T13:03:50.257 に答える
0

RoutingStrategy を変更してみてください。

http://msdn.microsoft.com/en-us/library/system.windows.routingstrategy.aspx

于 2012-09-27T11:13:53.987 に答える
-1

これには jquery event.preventDefault() API を使用できます。

于 2012-09-27T10:45:49.730 に答える