You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 23:42:02