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

如何在WPF中实现两次鼠标点击绘制直线的功能

WPF 通过两次独立鼠标点击绘制直线实现方案

原有代码问题说明

你提供的代码存在核心逻辑缺陷:第一次点击的坐标被定义为OnMouseLeftButtonDown方法内的局部变量,方法执行完成后局部变量会被回收,第二次点击时无法读取第一次存储的坐标,无法正常生成直线。

核心实现思路

  • 首先在窗口/页面类中定义全局状态变量,存储第一次点击的坐标和点击阶段标记,避免局部变量被回收
  • 第一次点击时仅记录坐标、切换阶段标记,无任何视觉反馈
  • 第二次点击时读取两次坐标生成直线,添加到Canvas后重置阶段标记,可支持连续绘制多组直线

预先定义类成员

在当前页面/窗口的类中先添加以下字段:

// 存储第一次点击的X、Y坐标
private double _firstClickX;
private double _firstClickY;
// 标记当前是否处于等待第二次点击的阶段
private bool _isWaitingSecondClick = false;

最终实现代码

private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    Point currentClickPos = e.GetPosition(this);
    // 处理第一次点击
    if (!_isWaitingSecondClick)
    {
        _firstClickX = currentClickPos.X;
        _firstClickY = currentClickPos.Y;
        _isWaitingSecondClick = true;
        return;
    }
    // 处理第二次点击
    double secondClickX = currentClickPos.X;
    double secondClickY = currentClickPos.Y;

    Line relationBound = new Line()
    {
        X1 = _firstClickX,
        Y1 = _firstClickY,
        X2 = secondClickX,
        Y2 = secondClickY,
        Stroke = Brushes.Red,
        StrokeThickness = 4
    };

    CanvasMain.Children.Add(relationBound);
    // 重置状态,等待下一次绘制
    _isWaitingSecondClick = false;
}

注意事项

  • 接收点击事件的Canvas控件必须设置背景属性,无背景需求可设置为Transparent,否则无法正常触发鼠标点击事件
  • 如果需要调整直线样式,可修改Stroke(颜色)、StrokeThickness(粗细)、StrokeDashArray(虚线样式)等属性

内容的提问来源于stack exchange,提问作者Filip Venera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:24:07