2016-05-15 65 views
2

这是我的工作情况:在WPF中,如何触发外部提供的元素上的鼠标事件?

situation

我想实现的是,悬停事件通过悬停元素处理,而其他鼠标事件被转发到底层的子元素堆叠面板。问题在于这些子元素从其他地方添加到堆栈面板,并可能有自己的子元素。

经过一番研究,我确定了这些可能的方法:

  1. 使用堆栈面板上的InputHitTest方法来确定命中元素,并用它RaiseEvent触发事件处理程序。问题在于InputHitTest方法只返回UI树中的叶子。我可以尝试手动向上冒泡事件,但是我发现这种肮脏的尝试先找到另一种解决方案。将事件从堆叠面板向下挖掘到命中叶子元素也是一样。
  2. 在堆栈面板上引发预览事件,该事件“自然”隧道到子控件。我尝试这样做:
MouseButtonEventArgs newArgs = new MouseButtonEventArgs(eventArgs.MouseDevice, eventArgs.Timestamp, eventArgs.ChangedButton); 
newArgs.RoutedEvent = Mouse.PreviewMouseDownEvent; 
hitElement.RaiseEvent(newArgs); 

但预期这是行不通的。难道我做错了什么?这实际上可能吗?

  1. 使用IInvokeProvider在堆栈面板上模拟事件的触发器。我没有仔细看过这个,因为我觉得它有点肮脏。

所以,是我想要的实际可能,所以,我该怎么做呢?

+0

为什么不处理隧道事件而不是手动提高隧道事件? – ViVi

+0

如果我理解正确,则建议在堆栈面板上处理预览事件。但是,由于悬停元素位于面板(及其子)之上,因此我认为预览事件不会经过那里。也许我错了,我绝不是WPF事件路由的专家。 –

+0

是的。有冒泡和隧道活动,这两种方式。隧道事件是那些** Preview **事件。在某些情况下,您只能使用这些事件,因为处理冒泡事件。很高兴知道你找到了解决方案。继续编码。 – ViVi

回答

0

我这样做解决了我的问题如下:

  • 删除悬停元素
  • 听PreviewMouseMove和鼠标离开事件的堆栈面板上
  • 使用GetPosition在PreviewMouseMove的EventArgs和手动是否评估鼠标是否在矩形边框内

真的很可耻简单...

相关问题