Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 停止控件处理路由事件_C#_Wpf_User Controls_Event Handling_Routed Events - Fatal编程技术网

C# 停止控件处理路由事件

C# 停止控件处理路由事件,c#,wpf,user-controls,event-handling,routed-events,C#,Wpf,User Controls,Event Handling,Routed Events,希望是一个简单的问题,因为我刚刚开始处理路由事件 我有一个自定义的UserControl。它包含许多其他控件 在我的树的后面,我想响应来自其中一个控件(不是我的UserControl)的双击事件。但是,我的UserControl显然正在捕获事件并将source属性设置为自身。我怎样才能阻止它这样做 我无法使用OriginalSource,因为它指向所单击的最低级别控件(Border或其他) 例如 MyWindow您可以使用jquery API来实现这一点。也许您可以尝试更改您的路由策略 我会像这

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

我有一个自定义的
UserControl
。它包含许多其他控件

在我的树的后面,我想响应来自其中一个控件(不是我的
UserControl
)的双击事件。但是,我的
UserControl
显然正在捕获事件并将
source
属性设置为自身。我怎样才能阻止它这样做

我无法使用
OriginalSource
,因为它指向所单击的最低级别控件(
Border
或其他)

例如


MyWindow您可以使用jquery API来实现这一点。

也许您可以尝试更改您的路由策略


我会像这样走在视觉树上:

        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);
        }
private void Window\u预览鼠标双击(对象发送器,鼠标按钮ventargs e)
{
var control=FindVisualParent(例如,作为DependencyObject的原始源);
if(控件!=null)
{
//魔法在这里发生
}
}
公共静态T FindVisualParent(DependencyObject子级),其中T:DependencyObject
{
var parent=visualtreeheloper.GetParent(子级);
如果(父项==null)
返回null;
T pT=作为T的父代;
返回pT!=null?pT:FindVisualParent(父级);
}

我通过将我的
UserControl
改为
ContentControl
来修复它。幸运的是,我的内容都是在运行时动态加载的,所以我不需要
UserControl
提供的设计时界面。尽管进行了大量搜索,但除了WPF中释放的一句话(第722页)之外,我找不到任何关于UserControl对事件影响的信息

这是因为UserControl与ContentControl几乎没有什么不同 基类;它有一个不同的默认控件模板,它有一个 双向拉伸的默认内容对齐方式(而不是 左侧和顶部),默认情况下将IsTabStop和Focusable设置为false, 并将从内部内容引发的任何事件的源更改为 是用户控件本身

我还不得不改用
PreviewMouseDown
而不是
MouseDoubleClick
,因为MouseDoubleClick不是一个真正的冒泡事件。见:

虽然此路由事件似乎遵循通过 元素树,它实际上是引发的直接路由事件 按每个UIElement沿着元素树


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

我不引发事件。控件。也许您可以编写一个自定义事件,在引发较低元素中的双击事件时由MyContainedControl引发。然后在MyWindow中,自定义元素的原始源应该是MyContainedControl1。向MyUserControl添加一个将EventHandler作为输入的方法。然后让该方法向MyContainedControl1-X注册处理程序。