【问题标题】:How do I recognize a mouse click on a line?如何识别鼠标点击一行?
【发布时间】:2011-09-27 03:10:25
【问题描述】:

我有一个 WPF 应用程序。有一个画布。当用户将鼠标拖到画布上时(从鼠标向下到鼠标向上),我画线。当用户按下鼠标时,我取初始点,当用户抬起鼠标时取最终点。然后我计算距离并在简单的鼠标向下、移动和向上事件中画线。

在画布上画了多条线后,我点击了任何一条线。我想选择该行并向用户显示该行已被选中(例如通过更改该行的颜色)。所以用户可以删除它。

谢谢。

【问题讨论】:

  • Line class,就像画布有 MouseDown 等事件一样。您可以在创建事件处理程序时连接它们并处理在处理程序中选择行。

标签: c# wpf mouseevent


【解决方案1】:

这是一个工作示例:(实现 Bala 在他的评论中提出的建议)

private void myCanvas_Loaded(object sender, RoutedEventArgs e)
        {
            Line line = new Line();

            line.MouseDown += new MouseButtonEventHandler(line_MouseDown);
            line.MouseUp   += new MouseButtonEventHandler(line_MouseUp);

            line.Stroke = Brushes.Black;
            line.StrokeThickness = 2;
            line.X1 = 30; line.X2 = 80;
            line.Y1 = 30; line.Y2 = 30;

            myCanvas.Children.Add(line);
        }

void line_MouseUp(object sender, MouseButtonEventArgs e)
        {
            // Change line colour back to normal 
            ((Line)sender).Stroke = Brushes.Black;
        }

void line_MouseDown(object sender, MouseButtonEventArgs e)
        {
            // Change line Colour to something
            ((Line)sender).Stroke = Brushes.Red;
        }

考虑到您已经有将线条添加到画布中的逻辑,

只需为您添加的每一行添加两个事件处理程序(如上)。

【讨论】:

    【解决方案2】:

    我建议您将自定义 MouseDown 事件处理程序添加到您的画布。事实上,如果你的线条很细,你需要让用户能够在线条附近点击来选择它。

    为此,在您的自定义 MouseDown 处理程序中,遍历您的行并执行以下操作:

    对于每一行:

    • 创建一个矩形,线的长度为 width 和 height = max(lineWidth, 10px),
    • 围绕矩形中心旋转鼠标坐标,角度等于直线角度(使用 math.atan2 计算),
    • 检查新的鼠标坐标是否在矩形内,
    • 如果是这样,请选择当前留置权并解除。

    【讨论】:

    • 嗨,Ribon,感谢您的关注。好吧,我无法理解您的第 2 步。您能说得更具体点吗?
    • 实际上,您的线条完全水平的可能性很小。因此,如果您围绕它们构建一个矩形(“定向边界框”),它将被旋转。好的,现在您需要知道您的鼠标单击是否在矩形内完成。但是,在矩形旋转时测试矩形是否包含某些东西有点复杂,因此您可能希望将鼠标坐标旋转矩形的反角,然后测试与矩形的碰撞,就像它没有旋转一样。
    猜你喜欢
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 2010-12-10
    • 1970-01-01
    相关资源
    最近更新 更多