我有一个窗口有几个框架控件,并希望在运行时找到控件的界限/矩形。它们使用带有高度/宽度/边距属性的XAML进入窗口的网格。如何在运行时确定C#中WPF控件的边界?
Frame控件没有Bounds,Rect,Top或Left属性。
其目的是测试每个帧,看看其他事件发生时鼠标是否在里面。我目前的工作是设置/清除MouseEnter和MouseLeave处理程序中的布尔标志,但必须有更好的方法。这可能很明显,因为我是C#WPF和.NET的新手。
我有一个窗口有几个框架控件,并希望在运行时找到控件的界限/矩形。它们使用带有高度/宽度/边距属性的XAML进入窗口的网格。如何在运行时确定C#中WPF控件的边界?
Frame控件没有Bounds,Rect,Top或Left属性。
其目的是测试每个帧,看看其他事件发生时鼠标是否在里面。我目前的工作是设置/清除MouseEnter和MouseLeave处理程序中的布尔标志,但必须有更好的方法。这可能很明显,因为我是C#WPF和.NET的新手。
你为什么不只是测试IsMouseOver或IsMouseDirectlyOver属性?
您可以通过VisualTreeHelper穿越你的控件,看看光标元素通过VisualTreeHelper.HitTest(...)
方法
这也行得通,但IsMouseOver似乎更直接。 – Ken 2009-06-08 12:27:13
虽然其他人已经满足了需要,但像往常一样,没有人回答这个抨击的问题。我可以想到任何需要界限确定的场景。例如,可以在主机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来代替。
谢谢 - 我错过了那个属性。 – Ken 2009-06-08 12:26:17