Как рисовать линии мышью в C#

В настоящее время я пытаюсь создать программу в форме Visual Studio WPF, которая рисует линии с помощью мыши, как в краске. В настоящее время он рисует ту же старую линию и продолжает рисовать ее, но я хочу рисовать новую линию каждый раз, когда я нажимаю левую кнопку мыши. Вот код MainWindows.xaml.cs и как он выглядит:

namespace DrawingLines
{

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private PathFigure _pathFigure = new PathFigure();
    PathFigureCollection _pathCollection = new PathFigureCollection();
    PathSegmentCollection _segments = new PathSegmentCollection();
    private PathGeometry _pathGeometry = new PathGeometry();

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        _pathFigure.Segments = _segments;
        _pathCollection.Add(_pathFigure);
        _pathGeometry.Figures = _pathCollection;
        myPath.Data = _pathGeometry;
    }

    private void Window_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            LineSegment segment = new LineSegment();
            segment.Point = e.GetPosition(this);
            _pathFigure.Segments.Add(segment);
        }

    }

    private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        _pathFigure.StartPoint = e.GetPosition(this);
    }

    //private void Window_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
    //{

    //}

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        this.Close();

    }
}

}

А вот код MainWindow.xmal:

<Window x:Class="DrawingLines.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Joonistamine" Height="350" Width="525" Loaded="Window_Loaded" MouseMove="Window_MouseMove" MouseLeftButtonDown="Window_MouseLeftButtonDown" MouseRightButtonDown="Window_MouseRightButtonDown">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="53*" />
        <RowDefinition Height="258*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="124*" />
        <ColumnDefinition Width="379*" />
    </Grid.ColumnDefinitions>
    <Path Stroke="Black" StrokeThickness="1" Name="myPath" Grid.ColumnSpan="2" Grid.RowSpan="2" />
    <Button Content="Exit" Height="25" HorizontalAlignment="Left" Name="button1" VerticalAlignment="Top" Width="46" Click="button1_Click" BorderBrush="Red" Foreground="#FFFF1A1A" />
</Grid>

What am i doing wrong?


person User_T    schedule 24.04.2013    source источник


Ответы (1)


Мне кажется, что вы постоянно добавляете в PathSegment, не очищая его, когда начинаете новую строку (щелчком левой кнопки мыши). Поэтому я бы попробовал так:

private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    _pathFigure.Segments.Clear();
    _pathFigure.StartPoint = e.GetPosition(this);
}

РЕДАКТИРОВАТЬ: ... и если вы хотите, чтобы он сохранял линии, и они не обязательно связаны, вам нужен отдельный путь для каждой строки, поскольку каждый путь представляет собой одну связанную форму.

Для этого вам нужно будет изменить свой код следующим образом:

  • Удалите путь из вашего XAML
  • Для каждого щелчка левой кнопкой мыши создайте новый путь и добавьте его в сетку (myGrid.Children.Add(myPath)
  • Добавить новые точки от движений мыши к текущему активному пути
person Kohanz    schedule 24.04.2013
comment
Это работает, но как мне нарисовать несколько строк, не удаляя последние? - person User_T; 24.04.2013
comment
@User_T Пожалуйста, посмотрите мое редактирование. Если мой ответ был вам полезен, пожалуйста, проголосуйте за него или отметьте его как ответ. Так вы получите бесплатную помощь от членов сообщества. Спасибо. - person Kohanz; 25.04.2013