2009-06-05 80 views
4

我有一个窗口有几个框架控件,并希望在运行时找到控件的界限/矩形。它们使用带有高度/宽度/边距属性的XAML进入窗口的网格。如何在运行时确定C#中WPF控件的边界?

Frame控件没有Bounds,Rect,Top或Left属性。

其目的是测试每个帧,看看其他事件发生时鼠标是否在里面。我目前的工作是设置/清除MouseEnter和MouseLeave处理程序中的布尔标志,但必须有更好的方法。这可能很明显,因为我是C#WPF和.NET的新手。

回答

3

你为什么不只是测试IsMouseOver或IsMouseDirectlyOver属性?

+0

谢谢 - 我错过了那个属性。 – Ken 2009-06-08 12:26:17

1

您可以通过VisualTreeHelper穿越你的控件,看看光标元素通过VisualTreeHelper.HitTest(...)方法

+0

这也行得通,但IsMouseOver似乎更直接。 – Ken 2009-06-08 12:27:13

5

虽然其他人已经满足了需要,但像往常一样,没有人回答这个抨击的问题。我可以想到任何需要界限确定的场景。例如,可以在主机HTML页面中使用IFRAME来显示HTML,并且可以根据面板的渲染边界来定位它,这将使您可以很好地将它集成到UI中。

您可以使用Point(0,0)上的GeneralTransform对根视觉坐标系确定控件的原点,并且直接显示ActualHeight和ActualWidth。

GeneralTransform gt = 
    TransformToVisual(Application.Current.RootVisual as UIElement); 
Point offset = gt.Transform(new Point(-1, -1)); 
myFrame.SetStyleAttribute("width", (ActualWidth + 2).ToString()); 
myFrame.SetStyleAttribute("height", (ActualHeight + 2).ToString()); 
myFrame.SetStyleAttribute("left", offset.X.ToString()); 
myFrame.SetStyleAttribute("top", offset.Y.ToString()); 
myFrame.SetStyleAttribute("visibility", "visible"); 

在样品上方我已经改变(-1,-1),并加入2至高度和宽度,以补偿周围的IFRAME单个像素边界区域 - 此代码是从工作的应用程序解除该使用IFRAME在浏览器托管时呈现“嵌入式”HTML。

此外,还有不止一种方法来剥皮猫,对于命中测试,您可能会发现VisualTreeHelper有趣。

IEnumerable<UIElement> VisualTreeHelper 
    .FindElementsInHostCoordinates(Point intersectingPoint, UIElement subtree) 

这将返回每个UIElement(通常来自鼠标)下的每个UIElement。有一个重载需要一个Rect来代替。