0
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace VectorGraphicEditor
{

    public partial class MainWindow : Window
    {
        Pen[] pen;
        int point_index = 0;
        Line line_cur = null;
        String mode;
        bool mb_press;
        Point currentPoint = new Point();
        int cnt = 0;
        public MainWindow()
        {
            InitializeComponent();
            pen = new Pen[100];
            for (int i = 0; i < 100; i++)
                pen[i]=new Pen(SystemColors.WindowFrameBrush,2f);
            mode = "Рисую линию";
            mb_press = false;
        }

        private void paintSurface_MouseUp(object sender, MouseButtonEventArgs e)
        {
            mb_press = false;
            cnt++;
        }
        private void paintSurface_MouseDown(object sender,MouseButtonEventArgs e)
        {
            double marker_x = -1, marker_y = -1;
            mb_press = true;
            if (e.LeftButton == MouseButtonState.Pressed)
                currentPoint = e.GetPosition(this);
            Line line;
            foreach (Line line1 in paintSurface.Children.OfType<Line>()) 
            {
                line = line1;
                if(Math.Abs(line.X1-e.GetPosition(this).X)<5&& Math.Abs(e.GetPosition(this).Y-100-line.Y1 ) < 5)
                {
                    point_index = 0;
                    marker_x = line.X1;
                    marker_y = line.Y1;
                    line_cur = line;
                }
                else if(Math.Abs(line.X2 - e.GetPosition(this).X) < 5 && Math.Abs(e.GetPosition(this).Y-100 - line.Y2) < 5)
                {
                    point_index = 1;
                    marker_x = line.X2;
                    marker_y = line.Y2;
                    line_cur = line;
                }
            }
        }
        private void paintSurface_MouseMove(object sender,MouseEventArgs e)
        {
            double marker_x = -1, marker_y = -1;
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                Line line=null;
                if (line_cur != null)
                {
                    if (point_index == 0)
                    {
                        line_cur.X1 = e.GetPosition(this).X;
                        line_cur.Y1 = e.GetPosition(this).Y-100;
                        marker_x = line_cur.X1;
                        marker_y = line_cur.Y1;
                        Console.WriteLine("Правлю точку 0");
                    }
                    else
                    {
                        line_cur.X2 = e.GetPosition(this).X;
                        line_cur.Y2 = e.GetPosition(this).Y - 100;
                        marker_x = line_cur.X2;
                        marker_y = line_cur.Y2;
                        Console.WriteLine("Правлю точку 1");
                    }
                    foreach(System.Windows.Shapes.Rectangle rect1 in paintSurface.Children.OfType<System.Windows.Shapes.Rectangle>())
                    {
                        paintSurface.Children.Remove(rect1);
                        break;
                    }
                    System.Windows.Shapes.Rectangle rect;
                    rect = new System.Windows.Shapes.Rectangle();
                    rect.Stroke = new SolidColorBrush(Colors.Red);
                    rect.Fill = new SolidColorBrush(Colors.Transparent);
                    rect.Width = 10;
                    rect.Height = 10;
                    Canvas.SetLeft(rect, marker_x - 5);
                    Canvas.SetTop(rect, marker_y - 5);
                    paintSurface.Children.Add(rect);
                    return;
                }
                else
                {
                    foreach (Line line1 in paintSurface.Children.OfType<Line>())
                    {
                        line = line1;
                        if (line.Name == "line_" + cnt)
                        {
                            break;
                        }
                        else line = null;
                    }
                }
                if (line_cur == null)
                {
                    if (line == null)
                    {
                        line = new Line();
                        line.Stroke = SystemColors.WindowFrameBrush;
                        line.X1 = currentPoint.X;
                        line.Y1 = currentPoint.Y - 100;
                        line.X2 = e.GetPosition(this).X;
                        line.Y2 = e.GetPosition(this).Y - 100;

                        currentPoint = e.GetPosition(this);
                        line.Name = "line_" + cnt;
                       line.Stroke = pen[cnt].Brush;
                        line.StrokeThickness = pen[cnt].Thickness;
                        paintSurface.Children.Add(line);
                    }
                    else
                    {
                        line.X2 = e.GetPosition(this).X;
                        line.Y2 = e.GetPosition(this).Y - 100;
                        paintSurface.InvalidateVisual();
                    }
                }
            }
            else
            {
                Line line = null;
                foreach (Line line1 in paintSurface.Children.OfType<Line>())
                {
                    line = line1;
                    if (Math.Abs(line.X1 - e.GetPosition(this).X) < 5 && Math.Abs(e.GetPosition(this).Y - line.Y1) < 5)
                    {
                        point_index = 0;
                        marker_x = line.X1;
                        marker_y = line.Y1;
                        line_cur = line;
                    }
                    else if (Math.Abs(line.X2 - e.GetPosition(this).X) < 5 && Math.Abs(e.GetPosition(this).Y - line.Y2) < 5)
                    {
                        point_index = 1;
                        marker_x = line.X2;
                        marker_y = line.Y2;
                        line_cur = line;
                    }
                }
            }
            if (marker_x != -1)
            {
                System.Windows.Shapes.Rectangle rect;
                rect = new System.Windows.Shapes.Rectangle();
                rect.Stroke = new SolidColorBrush(Colors.Red);
                rect.Fill = new SolidColorBrush(Colors.Transparent);
                rect.Width = 10;
                rect.Height = 10;
                Canvas.SetLeft(rect, marker_x - 5);
                Canvas.SetTop(rect, marker_y - 5);
                paintSurface.Children.Add(rect);
            }
            else
            {

                    foreach (Rectangle rect in paintSurface.Children.OfType<Rectangle>())
                    {
                        paintSurface.Children.Remove(rect);
                        line_cur = null;
                        paintSurface.InvalidateVisual();
                        break;
                    }

            }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            for (int i = cnt; i < 100; i++)
                pen[i].Brush = ((Button)sender).Background;

        }

        private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            for (int i = cnt; i < 100; i++)
             pen[i].Thickness=slider.Value;
        }
    }
}

введите сюда описание изображения

Почему у меня рисование выходит за границы canvas?разве такое может быть?почему-то в toolbar тоже можно рисовать,но я не определял для него функции.Toolbar сверху над canvas находится.Как ограничить рисование только для canvas?Плюс я пробовал сделать кнопку для очищения canvas и там убирался toolbar полностью.Toolbar это ребенок canvas?

Maxim Leo
  • 1
  • 1
  • 9
  • Линия - это объект, о чем я вам и говорил, векторная графика, линия существует отдельно от канваса. Чтобы обрезать все по границам канваса, надо ему задать параметр ClipToBounds="True". И вы кажется ничего не поизучали из того что я предлагал, вместо этого взяли код из винформ и просто затащили в WPF - очень популярная ошибка новичка. WPF если под него писать как под винформы, гораздо сложнее чем сам винформы. Так что если не хочется изучать его тонкости, лучше вернуться назад к винформам. – aepot Jun 12 '22 at 16:54
  • Я бы мог показать, как можно сделать просто векторный редактор, но я не увидел вопроса об этом. В рамках текущего вопроса, легко поможет ClipToBounds. – aepot Jun 12 '22 at 16:58
  • да,я пока не читал.смотрел только видео в ютубе. просто пытался поэксперементировать. ну я написал ClipToBounds="True" в xaml коде и toolbar исчез. Вы могли бы показать,как сделать векторный редактор, в каком плане?у вас есть готовая программа? – Maxim Leo Jun 12 '22 at 17:55
  • Если тулбар исчез, значит он у вас внутри канваса, а должен быть снаружи. Нет у меня готовой программы. – aepot Jun 12 '22 at 17:56
  • ну он просто не добавляется отдельно от канваса.только внутри.хотя я нажимаю на главное окно.если в xaml коде прописать вне канваса,то он пишет,что недопустимая разметка. – Maxim Leo Jun 12 '22 at 17:59
  • <Grid> сюда все что хотите в любом количестве </Grid>, сделайте грид и положите в него все что нужно. В окне может лежать что-то одно, а вот в гриде (это разновидность панели) - много всего. Почитайте основы XAML, штука просто мегаполезная, если работаете с WPF. – aepot Jun 12 '22 at 18:01
  • Окей,спасибо.все-таки придется конкретно так посидеть несколько дней почитать) – Maxim Leo Jun 12 '22 at 18:02
  • Оно того стоит. XAML не только в WPF, он и в UWP и в современно WinUI 3 есть, так что пригодится однозначно. HTML видели? вот это очень похоже. Вот, расслабьтесь, поиграйте – aepot Jun 12 '22 at 18:04
  • да,сразу увидел сходства с html. – Maxim Leo Jun 12 '22 at 18:07
  • Вы пока изучайте, если я найду время, попробую состряпать что-нибудь полезное для примера, самому интересно с одной темой поразбираться, а именно с этой – aepot Jun 12 '22 at 18:17

0 Answers0