2
这是我的工作情况:在WPF中,如何触发外部提供的元素上的鼠标事件?
我想实现的是,悬停事件通过悬停元素处理,而其他鼠标事件被转发到底层的子元素堆叠面板。问题在于这些子元素从其他地方添加到堆栈面板,并可能有自己的子元素。
经过一番研究,我确定了这些可能的方法:
- 使用堆栈面板上的
InputHitTest
方法来确定命中元素,并用它RaiseEvent
触发事件处理程序。问题在于InputHitTest
方法只返回UI树中的叶子。我可以尝试手动向上冒泡事件,但是我发现这种肮脏的尝试先找到另一种解决方案。将事件从堆叠面板向下挖掘到命中叶子元素也是一样。 - 在堆栈面板上引发预览事件,该事件“自然”隧道到子控件。我尝试这样做:
MouseButtonEventArgs newArgs = new MouseButtonEventArgs(eventArgs.MouseDevice, eventArgs.Timestamp, eventArgs.ChangedButton);
newArgs.RoutedEvent = Mouse.PreviewMouseDownEvent;
hitElement.RaiseEvent(newArgs);
但预期这是行不通的。难道我做错了什么?这实际上可能吗?
- 使用
IInvokeProvider
在堆栈面板上模拟事件的触发器。我没有仔细看过这个,因为我觉得它有点肮脏。
所以,是我想要的实际可能,所以,我该怎么做呢?
为什么不处理隧道事件而不是手动提高隧道事件? – ViVi
如果我理解正确,则建议在堆栈面板上处理预览事件。但是,由于悬停元素位于面板(及其子)之上,因此我认为预览事件不会经过那里。也许我错了,我绝不是WPF事件路由的专家。 –
是的。有冒泡和隧道活动,这两种方式。隧道事件是那些** Preview **事件。在某些情况下,您只能使用这些事件,因为处理冒泡事件。很高兴知道你找到了解决方案。继续编码。 – ViVi