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注册处理程序。