0

希望是一个简单的问题,因为我刚刚开始处理路由事件。

我有一个习惯UserControl。这包含许多其他控件。

UserControl在我的树的上方,我想响应源自其中一个包含的控件(不是 my )的双击事件。但是,我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,但此时事件已经将 Source 设置为MyUserControl甚至在调用 base 或任何东西之前。

非常感谢

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

也许您可以尝试更改您的 RoutingStrategy。

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

于 2012-09-27T11:13:53.987 回答
0

我已经设法通过将 my 更改UserControl为 a来解决它ContentControl。幸运的是,我的内容都是在运行时动态加载的,所以我不需要UserControl提供的设计时界面。尽管进行了很多搜索,但除了 WPF Unleashed 中的一句话(第 722 页)之外,我找不到任何关于事件的 UserControl 效果的信息

这是因为 UserControl 与它的 ContentControl 基类几乎没有区别。它有一个不同的默认控件模板,它在两个方向上都有一个默认的 Stretch 内容对齐方式(而不是 Left 和 Top),它默认将 IsTabStop 和 Focusable 设置为 false, 并将从内部内容引发的任何事件的源更改为是 UserControl 本身

我还不得不改用 usingPreviewMouseDown而不是MouseDoubleClick,因为 MouseDoubleClick 不是真正的冒泡事件。请参阅Control.MouseDoubleClick

尽管此路由事件似乎遵循通过元素树的冒泡路由,但它实际上是每个 UIElement 沿元素树引发的直接路由事件。

如果我需要UserControl,那么我认为我必须按照 Klaus78 的建议在 ContainedControl 中引发我自己的自定义事件,或者手动订阅每个 ContainedControl 上的双击事件,而不是让它们冒泡。

于 2012-09-27T13:03:50.257 回答
-1

您可以为此使用 jquery event.preventDefault() API。

于 2012-09-27T10:45:49.730 回答