以前寫過一些GetElementUnderMouse之類的函數,要用到坐標換算而顯得有些 麻煩(特別是當元素有XXXTransform的時候)
今天看到Mouse類居然有一個DirectlyOver屬性,可以獲得鼠標下的元素, 很 奇怪,我的MSDN文檔以及VS2008智能提示中都沒有顯示該屬性,但反編譯一下可 以看到。
但必須注意到的一點是,WPF控件是由各個元素復合而成的,但Mouse類可不知 道這概念,所以不要期望它為了返回一個Button,其很可能會返回Button的 visualTree中的TextBlock等,所以,如果我們加上如下的方法就完美了:
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;
}
兩者結合一下,我們的GetElementUnderMouse方法便可以如下書寫:
public static T GetElementUnderMouse<T>() where T: UIElement
{
return FindVisualParent<T> (Mouse.DirectlyOver as UIElement);
}