Как нарисовать линию движением мыши с помощью C#

#c# #wpf #mouseevent

#c# #wpf #mouseevent

Вопрос:

Я хочу нарисовать линию на холсте в 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 amp;amp; 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) Во-вторых, разумно ли добавлять обработчик событий в parentcanvas для обработки перемещения мыши (в output_MouseLeftButtonDown) или его следует добавить другим способом (не в parentCanvas)?

3) Наконец, ожидается ли, что вся функциональность будет работать должным образом, или есть лучший способ нарисовать линию движением мыши?

Комментарии:

1. Хорошо, ребята, ответ на первую часть, возможно, таков: var point = новая точка (мышь. GetPosition(parentCanvas). X, мышь. GetPosition(parentCanvas). Y) Есть какая-нибудь подсказка для второго? Где я должен назначить обработчик события MouseMove?

Ответ №1:

Я реализовал линию, которая нарисована почти так же, как ваша. Единственное отличие заключается в том, что моя линия определена в представлении xaml и является частью специального пользовательского элемента управления, производного от canvas. На ваши вопросы:

1.) параметр в GetPosition — это InputElement, который относится к позиции, которую вы хотите выяснить. Поскольку рисование происходит на вашем родительском сервере, используйте это.

2.) как упоминалось выше, parent canvas является вашим корневым элементом, поэтому лучше всего было бы прикрепить ваш mouseHandler к parentCanvas MouseMove

3.) Я бы не создавал новую линию каждый раз при перемещении мыши. Скорее используйте линию (или полилинию в вашем случае) в качестве закрытого элемента или используйте тот, который определен в XAML, и просто измените его геометрию с помощью свойства Data. например

 <Path x:Name="path" Stroke="Black" StrokeThickness="2" Data="{Binding PathGeometry}">
  

HTH