2016-05-15 74 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和手動是否評估鼠標是否在矩形邊框內

真的很可恥簡單...

相關問題