WPF中Canvas控件鼠标点击坐标转换为毫米单位的实现方法
WPF Canvas坐标转毫米实现方案
核心基于WPF设备无关单位与物理长度的换算逻辑实现,两种适配方案如下:
基础方案(默认96DPI场景)
WPF默认的坐标单位基准为96DPI(每英寸对应96个单位),结合1英寸=25.4毫米的换算规则,直接套用公式即可:毫米值 = 坐标值 * 25.4 / 96
修改后的事件代码如下:
private void canvasMain_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { var position = e.GetPosition(this.canvasMain); if(Keyboard.IsKeyDown(Key.LeftShift)) { double xMm = position.X * 25.4 / 96; double yMm = position.Y * 25.4 / 96; MessageBox.Show($"X-> {xMm:F2} mm - Y-> {yMm:F2} mm"); } }
高精度方案(适配实际显示器DPI)
如果需要和显示器实际物理尺寸完全对应,需要先获取当前显示设备的真实DPI替换基准值,实现代码如下:
// 新增获取当前显示器DPI的方法 private double GetCurrentDpi() { DpiScale dpiScale = VisualTreeHelper.GetDpi(canvasMain); return dpiScale.PixelsPerInchX; } private void canvasMain_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { var position = e.GetPosition(this.canvasMain); if(Keyboard.IsKeyDown(Key.LeftShift)) { double dpi = GetCurrentDpi(); double xMm = position.X * 25.4 / dpi; double yMm = position.Y * 25.4 / dpi; MessageBox.Show($"X-> {xMm:F2} mm - Y-> {yMm:F2} mm"); } }
注意:如果Canvas设置过缩放变换(如ScaleTransform),需要先将获取到的坐标除以缩放系数,再进行毫米换算,结果才准确。
内容的提问来源于stack exchange,提问作者Sandepku
相关产品推荐
相关产品推荐

