当前位置: 首页 > 知识库问答 >
问题:

如何使用MouseDown事件WPF在鼠标位置向InkCanvas添加形状

孟开宇
2023-03-14

我使用以下代码来设置大小,并在单击按钮时将正方形添加到inkcanvas。它将形状添加到画布的左上角。我希望能够在画布上单击鼠标的位置将形状添加到画布。

当前我获得鼠标位置:

private void inkCanvas_MouseMove(object sender, MouseEventArgs e)
{
    cursorCoords.Content = Mouse.GetPosition(Application.Current.MainWindow);

    // Get the x and y coordinates of the mouse pointer.
    System.Windows.Point position = e.GetPosition(this);
    pX = position.X;
    pY = position.Y;
}

选择“shape”工具(工具==3)后,在单击inkcanvas的位置绘制一个正方形。但是,这不起作用,只绘制一个标准笔划。此外,当我单击inkcanvas上的某个位置时,它不会将标签内容更新为当前位置坐标。

private void inkCanvas_MouseDown(object sender, MouseButtonEventArgs e)
{
    if (tool == 3)
    {
        coordstest.Content = pX + '-' + pY;
        switch (chosenShape)
        {
            case "square":
                Stroke oS = NewRectangle(pY, pX, size * 4, size * 4);

                DrawingAttributes attribs = new DrawingAttributes();
                attribs.Color = shapeColour;//Colors.LimeGreen;
                attribs.Height = 5.0;
                attribs.Width = 5.0;
                attribs.FitToCurve = false;

                oS.DrawingAttributes = attribs;
                inkCanvas.Strokes.Add(oS);
                break;
        }
    }
}

tools是选择的工具,存储在一个字节中为1、2或3,用于笔、背景颜色和形状。shapeChosen是一个字符串,会有正方形、星形、圆形、三角形的选项。

在inkcanvas鼠标按下事件处理程序中,是否缺少使上述操作发生的内容?当我要放置形状时,如何停止笔绘制?

共有1个答案

白文彬
2023-03-14

在这种情况下,MouseDown事件不起作用,因为它由InkCanvas处理并且没有冒泡,因此请尝试以下解决方案:

一、 使用AddHandler:

将handledEventsToo指定为true,以便为已被事件路由上的另一个元素标记为处理的路由事件调用提供的处理程序。

示例:

private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    MyInkCanvas.AddHandler(InkCanvas.MouseDownEvent, new MouseButtonEventHandler(InkCanvas_MouseDown), true);
}

private void InkCanvas_MouseDown(object sender, MouseButtonEventArgs e)
{

}

二、尝试使用PreviewMouseDown而不是MouseDown,因为PreviewMouseDown是隧道事件,并且在气泡事件之前首先运行his。

 类似资料:
  • 我使用以下代码在inkcanvas上的鼠标位置绘制一个正方形。但它不会在鼠标位置的中心绘制形状,而是稍微向右,再低一些,如下图所示: 此外,当我点击向画布添加形状时,我想停止笔的绘制。 怎样才能正确定位,停止画笔呢?

  • 我有一个视觉树,看起来像这样: 一个,包含一个,其中包含一个。 滚动查看器(ScrollViewer)占据了滚动查看器(ScrollViewer)边框(Border)的100%空间,而文本块(TextBlock)可能会也可能不会占据滚动查看器(ScrollViewer)的100%空间,具体取决于用户的配置方式。 我想为用户单击边框中的任何位置捕获鼠标向下事件。当我为边框或滚动查看器注册鼠标向下事件

  • 我是WPF的新手。 我想在Canvas上的鼠标移动事件上画一个圆圈。我已经编写了在画布上拖动它的逻辑。但是我想在鼠标点击我的画布时创建一个圆圈,它应该根据鼠标在画布上的移动来调整大小。 我怎样才能做到这一点? 这是我的代码

  • 我在JavaFX中制作了一个版本的风险。现在,为了显示游戏数据,我正在使用标签网格来显示有关每个区域的信息。我现在想在标签上有鼠标点击侦听器,这样我就可以通过点击它们来测试游戏功能,直到我制作了完整的游戏板。除非我尝试在FXML文档中添加侦听器,否则我会收到错误。现在,我正在控制器中声明标签,将它们添加到集合中,以便我可以使用循环绑定每个标签的文本属性,然后将每个标签添加到网格中。然后在FXML中

  • 我试图在JavaFX应用程序中获取鼠标点击的位置。我有一个事件处理程序: 这就是所谓的鼠标按下,释放和拖动。当我尝试更改EventHandler时,我无法从事件中获取鼠标的位置 我怎样才能把这个转移到MouseEvents?

  • 我在画布上处理鼠标事件时遇到问题。我想用鼠标来绘制它,我已经想出了这些事件处理程序,但当我开始绘制时,它们什么都不做。 你能帮我告诉我遗漏了什么或者如何重写它以便它开始工作吗?