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

Ken*_*Ken 4 .net c# wpf

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

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

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

Tho*_*que 5

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


Pet*_*one 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");
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我已经转换了(-1,-1)并在高度和宽度上添加了2以补偿IFRAME周围的单个像素边界区域 - 此代码从使用IFRAME呈现"嵌入"的工作应用程序中解除"浏览器托管时的HTML.

此外,还有不止一种方法可以对猫进行皮肤检测,对于热门测试,您可能会发现VisualTreeHelper很有趣.

IEnumerable<UIElement> VisualTreeHelper
  .FindElementsInHostCoordinates(Point intersectingPoint, UIElement subtree)
Run Code Online (Sandbox Code Playgroud)

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