以往寫 GetElementUnderMouse 需座標轉換,遇元素有 Transform 更麻煩。今日發現 Mouse 類有 DirectlyOver 屬性可直接獲取鼠標下元素,但 MSDN 文檔與 VS 2008 IntelliSense 均未顯示,反編譯才可見。
WPF 控件由多元素組合 (如 Button 含 TextBlock),Mouse.DirectlyOver 可能返回內部元素 (TextBlock) 而非控件本身 (Button)。
public static T FindVisualParent<T>(UIElement element) where T : UIElement {
UIElement parent = element;
while (parent != null) {
var correctlyTyped = parent as T;
if (correctlyTyped != null) return correctlyTyped;
parent = VisualTreeHelper.GetParent(parent) as UIElement;
}
return null;
}
public static T GetElementUnderMouse<T>() where T : UIElement {
return FindVisualParent<T>(Mouse.DirectlyOver as UIElement);
}
兩者結合,GetElementUnderMouse<Button>() 即可精準獲取鼠標下的 Button,而非其內部 TextBlock。