【发布时间】:2017-11-21 07:48:48
【问题描述】:
我是 WPF 新手。
我想在鼠标移动事件上在画布上画一个圆圈。我已经编写了将其拖到画布上的逻辑。但是我想在我的画布上单击鼠标时创建一个圆圈,并且它应该根据鼠标在画布上的移动来调整大小。
我怎样才能做到这一点?
这是我的代码
Ellipse elip = new Ellipse();
private double pointx;
private double pointy;
private void canvas_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
canvas.MouseMove -= MouseMove_NotDown;
canvas.MouseMove += canvas_PreviewMouseMove;
canvas.MouseUp += canvas_PreviewMouseUp;
Point location = e.MouseDevice.GetPosition(canvas);
elip = new Ellipse();
elip.Height = 1;
elip.Width = 1;
elip.Stroke = Brushes.Black;
elip.StrokeThickness = 2;
Canvas.SetTop(elip, location.Y + 1);
Canvas.SetLeft(elip, location.X + 1);
pointx = location.X + 1;
pointy = location.Y + 1;
canvas.Children.Add(elip);
}
private void MouseMove_NotDown(object sender, MouseEventArgs e)
{
canvas.Cursor = Cursors.Hand;
}
private void canvas_PreviewMouseMove(object sender, MouseEventArgs e)
{
try
{
Point location = e.MouseDevice.GetPosition(canvas);
double height = location.Y - pointy;
double width = location.X - pointx;
if (height >= 0 && width >= 0)
{
elip.Height = height;
elip.Width = width;
}
else if (height < 0 || width < 0)
{
if (height < 0)
{
elip.Height = height + (-height) + 1;
elip.Width = width;
}
else if (width < 0)
{
elip.Height = height;
elip.Width = width + (-width) + 1;
}
}
}
catch
{
}
}
private void canvas_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
elip.Stroke = Brushes.Black;
elip.StrokeThickness = 2;
canvas.MouseMove -= canvas_PreviewMouseMove;
canvas.MouseMove += MouseMove_NotDown;
canvas.MouseUp += canvas_PreviewMouseUp;
}
【问题讨论】:
-
请发布您迄今为止尝试过的内容。一些指针,将您的画布背景设置为颜色(如果您不想要颜色,则为透明),否则它将不会获得鼠标单击事件。然后您将使用 MouseDown 和 MouseMove 事件处理程序。
-
谢谢大家。我已经更新了我的代码,请看一下。提前致谢。
-
阅读该代码的提示;监听器的所有附加和删除意味着 lot 可能会因为应该如此简单的事情而出错。尽量避免这种情况。
-
感谢格鲁特。你能否解释一下,这将有助于我解决我的问题。当我尝试绘制第 11 个圆圈时,我最多可以使用上面的代码绘制 10 个圆圈,但它不起作用。
-
我将在稍后发布一个示例。当您初始化控件(或窗口)时,只需附加一次侦听器会更容易。