如何在运行时确定C#中WPF控件的边界?

时间:2009-06-05 18:16:31

标签: c# .net wpf

我有一个带有几个Frame控件的Window,想在运行时找到控件的Bounds / Rectangle。它们使用具有高度/宽度/边距属性的XAML进入窗口的网格。

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

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

3 个答案:

答案 0 :(得分: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(通常来自鼠标)。有一个重载需要一个Rect。

答案 1 :(得分:3)

为什么不直接测试IsMouseOver或IsMouseDirectlyOver属性?

答案 2 :(得分:1)

您可以通过VisualTreeHelper遍历控件,并通过VisualTreeHelper.HitTest(...)方法查看元素中的光标