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

即使光标在画布之外,也会调用MouseMobile事件。画布周围的“边界”不起作用

乜栋
2023-03-14

对未来情况的简要描述:

当鼠标在画布上移动时,我希望在画布上显示一个椭圆。椭圆应该一直跟随鼠标移动,直到用户点击鼠标左键。当用户点击鼠标左键时,程序会将椭圆放置在画布上。

因此,我使用了以下xaml代码:

    <Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="700" Width="1200">



<Grid>
    <Border ClipToBounds="true">
    <Canvas x:Name="canvasss" Background="AntiqueWhite" Width="524" Height="368" MouseMove="Canvasss_MouseMove" MouseDown="Canvasss_MouseDown">

    </Canvas>
    </Border>
</Grid>

和c#代码:

    using System.Collections.Generic;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Shapes;

    namespace WpfApplication1
    {
         public class Item
         {
            private readonly Ellipse shape;

            public Item(Canvas canvas)
            {
                shape = new Ellipse { Width = 50, Height = 50, Fill = Brushes.Black };
                canvas.Children.Add(shape);
                SetPosition(0.0, 0.0);
            }

            public void SetPosition(double x, double y)
            {
                Canvas.SetLeft(shape, x);
                Canvas.SetTop(shape, y);
            }
        }

        public partial class MainWindow : Window
        {
            private readonly IList<Item> shapes;
            private Item currentMovingShape;

            public MainWindow()
            {
                InitializeComponent();
                shapes = new List<Item>();
                InitMovingShape();
            }

            private void InitMovingShape()
            {
                currentMovingShape = new Item(canvasss);
            }

            private void SetMovingShapePosition(MouseEventArgs e)
            {
                var pos = e.GetPosition(canvasss);
                currentMovingShape.SetPosition(pos.X - 25, pos.Y - 25);
            }

            private void Canvasss_MouseMove(object sender, MouseEventArgs e)
            {
                var pos = e.GetPosition(canvasss);
                currentMovingShape.SetPosition(pos.X - 25, pos.Y - 25);
            }

            private void Canvasss_MouseDown(object sender, MouseButtonEventArgs e)
            {
                shapes.Add(currentMovingShape);
                InitMovingShape();            
            }


         }
    }

问题是,一旦鼠标离开画布,椭圆仍然会粘在鼠标上,甚至可以将椭圆放置在画布之外。

首先,我使用了代码(代码来自stijn: C#-WPF-画布上的Mousemove事件会重载鼠标事件,因此不会触发单击事件),而没有在xaml代码中的画布周围的边界。然后我读到在画布周围放置一个边界可能会有所帮助(即使光标在画布之外也会调用MouseMobile事件)并将其实现到您可以看到的xaml代码中。不幸的是,它没有帮助。

有人能帮我解决吗?我非常欣赏代码解决方案,因为我是c#的初学者。

共有1个答案

傅俊德
2023-03-14

看起来您想在控件中实现装饰器。一定要阅读它们,因为它们将方便地在wpf中轻松执行这些操作。

但是,要解决您的问题。您应该在代码中实现MouseEnter和MouseLeave事件。在MouseEnter上添加形状,然后在MouseLeave或MouseDown上删除形状。因此,当鼠标重新进入画布时,MouseEnter逻辑将启动并添加形状,您的MouseMove逻辑将使用鼠标移动形状。希望我在这里说清楚。如果您仍在与代码斗争,请告诉我。

编辑

xaml

<Grid Background="Transparent">
        <Canvas x:Name="canvasss" Background="AntiqueWhite" Width="300" Height="300"  MouseEnter="canvasss_MouseEnter" MouseLeave="canvasss_MouseLeave"  MouseMove="Canvasss_MouseMove" MouseDown="Canvasss_MouseDown" Margin="50" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Grid>

密码

public partial class MainWindow : Window
    {
        private readonly IList<Ellipse> shapes;
        private Ellipse currentMovingShape;
        public MainWindow()
        {
            InitializeComponent();
            shapes = new List<Ellipse>();
        }

        private void canvasss_MouseEnter(object sender, MouseEventArgs e)
        {
            AddEllipse();
        }

        private void AddEllipse()
        {
            currentMovingShape = new Ellipse { Width = 50, Height = 50, Fill = Brushes.Black };
            currentMovingShape.IsHitTestVisible = false;
            canvasss.Children.Add(currentMovingShape);
            Canvas.SetLeft(currentMovingShape, Mouse.GetPosition(canvasss).X - 25);
            Canvas.SetTop(currentMovingShape, Mouse.GetPosition(canvasss).Y - 25);
        }

        private void canvasss_MouseLeave(object sender, MouseEventArgs e)
        {
            if (currentMovingShape != null)
            {
                canvasss.Children.Remove(currentMovingShape);
                currentMovingShape = null;
            }
        }
        private void Canvasss_MouseMove(object sender, MouseEventArgs e)
        {
            Canvas.SetLeft(currentMovingShape, e.GetPosition(canvasss).X - 25);
            Canvas.SetTop(currentMovingShape, e.GetPosition(canvasss).Y - 25);
        }

        private void Canvasss_MouseDown(object sender, MouseButtonEventArgs e)
        {
            if (currentMovingShape != null)
            {
                currentMovingShape.IsHitTestVisible = true;
                shapes.Add(currentMovingShape);
                AddEllipse();
            }

        }
    }
 类似资料:
  • 我不知道我的代码或WPF是否有问题,但问题是:我想创建一个小程序,你可以在画布上用光标绘制。我有一个简单的WPF窗口: 这是后台代码: 我能做的是:https://www.dropbox.com/s/7moq4p8f8f409b3/wpf_canvas.png 当光标位于画布之外时,为什么要调用StackPan\u MouseMove? 这是可执行文件,您可以在其中注意到这种行为:https://

  • 我正在使用硒与Java(最新的两个)。试图在我们的WebApp中的一个模式内的一个小画布区域上进行绘制。我们用来画布的库是'Signature pad JS'。我已经确认了它不是在iframe或任何可能出现问题的棘手的东西(它只是一个带有div.signature-input canvas元素的常规div.modal-body)。 但它什么也没做。我在这里看了很多stackoverflow的帖子,

  • 问题内容: 我一直在使用Tkinter小部件,以查看是否可以制作一些美观的小部件,并且我有几个问题。 首先,为什么我的Canvas小部件周围有一个 浅灰色边框 ,如何摆脱它? 其次,为什么画布(2,2)中最左上角的位置?似乎应该是(0,0)。 我当前的脚本: 问题答案: 6.8节为什么画布似乎不从0,0开始?在的Tk的使用FAQ描述的现象。 通过对发布的源进行微小的更改,我就可以消除边界伪影… 更

  • 在IE9画布中现在是否支持虚线/点线?目前我正在做与以下内容非常相似的事情: 这在IE7、IE8、IE9兼容模式和FireFox中工作很好,然而,在IE9和Chrome中,为每条虚线绘制一个实心笔画。 对为什么会发生这种情况有什么想法吗?

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

  • 问题内容: 尝试使用awt canvas上的鼠标来绘制图形(目前为线)。Iam首次尝试Java图形。所以不确定如何去做。这是我的第一次尝试: 问题:1)将窗口最小化并还原后,绘制的线条消失了(由于要重新绘制)2)我要的是该线条应跟随鼠标移动(拖动时)。最后一行应该从按下位置到释放鼠标的位置。现在请礼节,当鼠标移动时,将绘制新的线条。我不确定如何清除画布上的中间线。 有人可以帮我解决这些问题吗? 问