在Win32 API中,有一個非常有用的函數,叫做:WindowFromPoint
而在WPF中,有一個類型的函數,叫做:HitTest(InputHitTest),但是這個函數探測的太深了,往往會探測到控制項的子項目上去
於是我寫了一個WPF版的WindowFromPoint函數,為了在一個函數裡實現全部的功能,使用了Lambda運算式的遞迴實現(估且叫偽遞迴吧),所以對很多人來說,可能會顯然比較晦澀:
FrameworkElement WindowFromPoint(FrameworkElement root, Point p)<br /> {<br /> FrameworkElement fe = root.InputHitTest(p) as FrameworkElement;<br /> if (fe == root || fe==null)<br /> return fe;<br /> Func<FrameworkElement, FrameworkElement> func = null;<br /> func = feArg =><br /> {<br /> FrameworkElement parent = feArg.Parent as FrameworkElement;<br /> FrameworkElement vtParent = VisualTreeHelper.GetParent(feArg) as FrameworkElement;<br /> if (vtParent == parent)<br /> while (parent != null)<br /> {<br /> if (parent == root)<br /> return feArg;<br /> parent = parent.Parent as FrameworkElement;<br /> }<br /> return func(vtParent);<br /> };<br /> return func(fe);<br /> }
|=here=|