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