我想通过鼠标移动在wpf的画布上绘制一条线。从特定形状开始并按下鼠标左键,我想在鼠标移动的位置精确绘制一条线。为此,我添加了以下几行代码中详细描述的三个事件处理程序:
private void output_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Console.WriteLine(parentCanvas.Name);
Console.ReadLine();
isMouseDragging = true;
/* rectCanvas.MouseLeftButtonDown -= new MouseButtonEventHandler(Canvas_MouseLeftButtonDown);
rectCanvas.MouseLeftButtonUp -= new MouseButtonEventHandler(Canvas_MouseLeftButtonUp);
rectCanvas.MouseMove -= new MouseEventHandler(Canvas_MouseMove); */
-> parentCanvas.MouseMove += new MouseEventHandler(output_MouseMove);
}
private void output_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
isMouseDragging = false;
}
private void output_MouseMove(object sender, MouseEventArgs e)
{
if (isMouseDragging && e.LeftButton == MouseButtonState.Pressed)
{
connection_Line = new Polyline();
connection_Line.Stroke = System.Windows.Media.Brushes.SlateGray;
connection_Line.StrokeThickness = 2;
connection_Line.FillRule = FillRule.EvenOdd;
-> var point = e.GetPosition();
PointCollection myPointCollection = new PointCollection();
myPointCollection.Add(point);
connection_Line.Points = myPointCollection;
parentCanvas.Children.Add(connection_Line);
}
}
1)第一个问题是在最后一个方法中包含的方法e.GetPosition()中添加什么作为参数,以便始终保持鼠标所在的当前点。
2)其次是在父扫描中添加事件处理程序来处理鼠标移动(在output_MouseLeftButtonDown中)还是应该以不同的方式添加(不在parentCanvas上)?
3)最后,如果预期整个功能正常工作或是否有更好的方法通过鼠标移动绘制线条?
答案 0 :(得分:1)
我已经实现了一条几乎与您相似的线。唯一的区别是我的行是在xaml视图中定义的,并且是从画布派生的特殊用户控件的一部分。 对你的问题:
1。)getPosition中的参数是与您想要找到的位置相关的InputElement。当绘图在您的父浏览器上进行时,请使用此功能。
2。)如上所述,父画布是你的根元素,所以最好将你的mouseHandler附加到parentCanvas MouseMove
3。)每次鼠标移动时我都不会创建新行。而是使用Line(或您的情况下的折线)作为私有成员或使用XAML中定义的一个,只需通过Data属性更改其Geometry。 e.g。
<Path x:Name="path" Stroke="Black" StrokeThickness="2" Data="{Binding PathGeometry}">
HTH