如何获取WPF PresentationFramework中Location控件的坐标信息?
获取WPF Location控件的坐标信息
嘿,这个问题其实很常见,因为你的Location控件是放在Canvas容器里的,它的位置是由Canvas的附加属性来管理的,所以直接通过控件本身的属性找不到Left/Top,得用Canvas提供的静态方法来获取。
下面给你几种常用的获取方式,根据你的需求选择:
1. 获取控件在Canvas中的原始定位坐标(最符合你的需求)
因为你在XAML里设置的是Canvas.Left和Canvas.Top,所以直接用Canvas的静态方法就能拿到这些值:
private void Location_MouseDoubleClick(object sender, MouseButtonEventArgs e) { <namespace>.Location loc = sender as <namespace>.Location; if (loc != null) { // 获取X坐标(对应XAML里的Canvas.Left) double x = Canvas.GetLeft(loc); // 获取Y坐标(对应XAML里的Canvas.Top) double y = Canvas.GetTop(loc); // 这里就可以使用x和y的值了 } }
为什么要用Canvas.GetLeft()而不是loc.Left?因为Left和Top不是UserControl自带的属性,它们是Canvas为子元素提供的附加属性,用来告诉Canvas该怎么摆放这个控件,所以必须通过Canvas的静态方法来读取。
2. 获取控件相对于父窗口/页面的坐标
如果你需要的是控件左上角相对于整个窗口的位置,可以用TransformToAncestor方法:
Point relativeToWindow = loc.TransformToAncestor(this).Transform(new Point(0, 0)); // relativeToWindow.X 和 relativeToWindow.Y 就是相对于窗口的坐标
3. 获取控件相对于屏幕的坐标
如果要拿到屏幕坐标系下的位置,用PointToScreen方法:
Point relativeToScreen = loc.PointToScreen(new Point(0, 0)); // relativeToScreen.X 和 relativeToScreen.Y 就是屏幕上的坐标
总结一下,最贴合你需求的就是第一种方式,直接读取Canvas附加属性的值,这就是你在XAML里设置的那个坐标,完全不需要依赖鼠标事件就能获取到~
内容的提问来源于stack exchange,提问作者Dominique




