簡體   English   中英

為什么沒有MouseMoveEvent - 或者,如何使用AddHandler進行鼠標移動事件

[英]Why is there no MouseMoveEvent — or, how to use AddHandler for the mouse move event

UIElement類定義靜態RoutedEvent成員MouseLeftButtonDownEventMouseLeftButtonUpEvent - 但是沒有MouseMoveEvent 據我所知,框架層次結構中的任何類都沒有。 有常規事件定義:

public event MouseEventHandler MouseMove;

所以你可以寫:

void AttachHandler(UIElement element)
{
    element.MouseMove += OnMouseMove;
}

但是你不能使用另一種形式,它允許你訂閱甚至處理過的事件:

void AttachHandler(UIElement element)
{
    element.AddHandler(UIElement.MouseMoveEvent, new MouseEventHandler(OnMouseMove), true);
}

所以我的問題是雙重的:

  1. 為什么在任何地方都沒有定義MouseMoveEvent
  2. 是否有一種解決方法,允許您獲取MouseMove事件的通知,即使它們被處理?

編輯

我看到MSDN文檔承認這是一個限制

此技術的局限性在於AddHandler API采用RoutedEvent類型的參數來標識所討論的路由事件。 並非所有Silverlight路由事件都提供RoutedEvent標識符,因此這種考慮會影響在Handled案例中仍可處理哪些路由事件。

編輯#2

根據@HansPassant,一般的答案是“MouseMove”事件不能被標記為“已處理”,因此它們總是冒泡。 除了明顯的邊緣情況之外,TextBox也是如此:當您單擊TextBox的文本區域,從而激活拖動到選擇的東西時,“MouseMove”事件不再被觸發。 我不知道為什么會這樣。


注意 - 對於任何好奇的人 - 我正在嘗試編寫一個允許用戶拖放TextBox的行為。 TextBox控件默認攔截鼠標事件,以允許文本選擇。

它在MSDN文章中明確提到:

MouseMove不能與AddHandler一起使用,因為其事件數據中沒有Handled

所以這回答了你的問題:

為什么在任何地方都沒有定義MouseMoveEvent?

因為不需要。

是否有一種解決方法,允許您獲取MouseMove事件的通知,即使它們被處理?

你不需要一個,它們無法處理,因此總是冒泡。 Window的MouseMove事件處理程序將看到它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM