在WPF中,如何在外部提供的元素上触发鼠标事件?

时间:2016-05-15 12:35:41

标签: c# wpf user-interface events mouseevent

这就是我与之合作的情况:

situation

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

经过一些研究,我发现了这些可能的方法:

  1. 使用堆栈面板上的InputHitTest方法识别命中元素,并在其上使用RaiseEvent来触发事件处理程序。这个问题是InputHitTest方法只返回UI树中的叶子。我可以尝试向上手动鼓泡事件,但我觉得这很脏,试图先找到另一个解决方案。将事件从堆栈面板向下隧道化到命中叶元素也是如此。
  2. 在堆栈面板上提升预览事件,隧道"自然地"儿童控制。我试过这个:
  3. MouseButtonEventArgs newArgs = new MouseButtonEventArgs(eventArgs.MouseDevice, eventArgs.Timestamp, eventArgs.ChangedButton);
    newArgs.RoutedEvent = Mouse.PreviewMouseDownEvent;
    hitElement.RaiseEvent(newArgs);
    

    但它并没有像预期的那样发挥作用。难道我做错了什么?这实际上是可能的吗?

    1. 使用IInvokeProvider在堆栈面板上模拟事件的触发器。我没有详细看过这个,因为我发现它有点脏。
    2. 所以,我真正想要的是什么,所以,我应该怎么做?

1 个答案:

答案 0 :(得分:0)

我通过以下方式解决了我的问题:

  • 删除悬停元素
  • 收听堆栈面板上的PreviewMouseMove和MouseLeave事件
  • 在PreviewMouseMove eventArgs上使用xs并手动评估鼠标是否在矩形边框内

真是可耻的简单......