Форум программистов, компьютерный форум, киберфорум
Наши страницы

C#: WPF, UWP и Silverlight

Войти
Регистрация
Восстановить пароль
 
Naomis
7 / 7 / 1
Регистрация: 11.03.2015
Сообщений: 212
Завершенные тесты: 1
#1

(wpf) InkCanvas отрисовка базовых фигур - C# WPF

19.01.2017, 17:06. Просмотров 444. Ответов 0
Метки wpf (Все метки)

Доброго дня. Создаю "рисовалку" и мне нужна возможность создания базовых фигур, то есть как в paint'е(прямоугольник заполненный/незаполненный, круг заполненный/незаполненный, линия, разная толщина на эти плюшки). Изгуглил много чего и много чего нашел, есть разные методы. Я нашел довольно презентабельный путь для этого на MSDN. Во втором подходе предлагается переопределить метод DrawCore класса Stroke. Описано довольно подробно, так же есть другие примеры на эту тему(раз, два), но моя проблема в том, что я в упор не понимаю как соединить одно с другим.

У меня есть холст(inkCanvas), методы которые с ним работают(рисовать, стирать и тд), добавляю по соседству класс CustomStroke наследуемый от Stroke. И... Что дальше? Метод DrawCore переопределен, но как связать это всё во едино? Я так понимаю, что нужно как-то подключить класс? Но я опять же не понимаю где взять StylusPointCollection. Прошу немного пояснить, что мне следует сделать.

Вот код класса:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
    public class CustomStroke : Stroke
    {
        public CustomStroke(StylusPointCollection pts) : base(pts)
        {
            this.StylusPoints = pts;
        }
 
        protected override void DrawCore(DrawingContext drawingContext, DrawingAttributes drawingAttributes)
        {
            if (drawingContext == null)
            {
                throw new ArgumentNullException("drawingContext");
            }
            if (null == drawingAttributes)
            {
                throw new ArgumentNullException("drawingAttributes");
            }
            DrawingAttributes originalDa = drawingAttributes.Clone();
            SolidColorBrush brush2 = new SolidColorBrush(drawingAttributes.Color);
            brush2.Freeze();
            drawingContext.DrawRectangle(brush2, null, new Rect(GetTheLeftTopPoint(), GetTheRightBottomPoint()));
        }
 
        System.Windows.Point GetTheLeftTopPoint()
        {
            if (this.StylusPoints == null)
                throw new ArgumentNullException("StylusPoints");
            StylusPoint tmpPoint = new StylusPoint(double.MaxValue, double.MaxValue);
            foreach (StylusPoint point in this.StylusPoints)
            {
                if ((point.X < tmpPoint.X) || (point.Y < tmpPoint.Y))
                    tmpPoint = point;
            }
            return tmpPoint.ToPoint();
        }
 
        System.Windows.Point GetTheRightBottomPoint()
        {
            if (this.StylusPoints == null)
                throw new ArgumentNullException("StylusPoints");
            StylusPoint tmpPoint = new StylusPoint(0, 0);
            foreach (StylusPoint point in this.StylusPoints)
            {
                if ((point.X > tmpPoint.X) || (point.Y > tmpPoint.Y))
                    tmpPoint = point;
            }
            return tmpPoint.ToPoint();
        }
    }
За ранее спасибо.

Добавлено через 1 час 12 минут
Решено

C#
1
2
3
            inkCanvas.PreviewMouseDown += inkCanvas_MouseDown;
            inkCanvas.PreviewMouseMove += inkCanvas_MouseMove;
            inkCanvas.PreviewMouseUp += inkCanvas_MouseUp;
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
        Point currentPoint, mouseLeftDownPoint;
        bool IsDrawing = false;
        private void inkCanvas_MouseDown(Object sender, MouseEventArgs e)
        {
            IsDrawing = true;
            mouseLeftDownPoint = e.GetPosition((IInputElement)sender);
        }
 
        Stroke st = null;
        private void inkCanvas_MouseMove(Object sender, MouseEventArgs e)
        {
            if (IsDrawing)
            {
                currentPoint = e.GetPosition((IInputElement) sender);
                StylusPointCollection pts = new StylusPointCollection();
 
                pts.Add(new StylusPoint(mouseLeftDownPoint.X, mouseLeftDownPoint.Y));
                pts.Add(new StylusPoint(currentPoint.X, currentPoint.Y));
 
                if (st != null)
                    inkCanvas.Strokes.Remove(st);
                st = new CustomStroke(pts);
 
                st.DrawingAttributes.Color = Colors.DarkOrange;
                inkCanvas.Strokes.Add(st);
            }
        }
        private void inkCanvas_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if (st != null)
            {
                inkCanvas.Strokes.Remove(st);
                inkCanvas.Strokes.Add(st.Clone());
            }
            IsDrawing = false;
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class CustomStroke : Stroke
    {
        public CustomStroke(StylusPointCollection pts) : base(pts)
        {
            this.StylusPoints = pts;
        }
 
        protected override void DrawCore(DrawingContext drawingContext, DrawingAttributes drawingAttributes)
        {
            if (drawingContext == null)
            {
                throw new ArgumentNullException("drawingContext");
            }
            if (null == drawingAttributes)
            {
                throw new ArgumentNullException("drawingAttributes");
            }
            DrawingAttributes originalDa = drawingAttributes.Clone();
            SolidColorBrush brush2 = new SolidColorBrush(drawingAttributes.Color);
            brush2.Freeze();
            //drawingContext.DrawRectangle(brush2, null, new Rect(GetTheLeftTopPoint(), GetTheRightBottomPoint()));
 
            StylusPoint stp = this.StylusPoints[0];
            StylusPoint sp = this.StylusPoints[1];
            double radius = System.Math.Sqrt(System.Math.Pow((double)(sp.X - stp.X), 2) + System.Math.Pow((double)(sp.Y - stp.Y), 2))/2.0;
 
            drawingContext.DrawEllipse(brush2, null, new Point((sp.X + stp.X) / 2.0, (sp.Y + stp.Y) / 2.0), radius, radius);
        }
 
        System.Windows.Point GetTheLeftTopPoint()
        {
            if (this.StylusPoints == null)
                throw new ArgumentNullException("StylusPoints");
            StylusPoint tmpPoint = new StylusPoint(double.MaxValue, double.MaxValue);
            foreach (StylusPoint point in this.StylusPoints)
            {
                if ((point.X < tmpPoint.X) || (point.Y < tmpPoint.Y))
                    tmpPoint = point;
            }
            return tmpPoint.ToPoint();
        }
 
        System.Windows.Point GetTheRightBottomPoint()
        {
            if (this.StylusPoints == null)
                throw new ArgumentNullException("StylusPoints");
            StylusPoint tmpPoint = new StylusPoint(0, 0);
            foreach (StylusPoint point in this.StylusPoints)
            {
                if ((point.X > tmpPoint.X) || (point.Y > tmpPoint.Y))
                    tmpPoint = point;
            }
            return tmpPoint.ToPoint();
        }
    }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.01.2017, 17:06
Я подобрал для вас темы с готовыми решениями и ответами на вопрос (wpf) InkCanvas отрисовка базовых фигур (C# WPF):

Отрисовка сложных фигур на canvas - C# WPF
собственно вопрос, как из простых фигур, можно делать сложные? Когда я рисовал такие вот фигурки https://i.paste.pics/1PB0O.png все...

.NET 4.x WPF canvas отрисовка точки - C# WPF
Здравствуйте уважаемые Форумчане. Может что то не правильно понимаю, так как многого не знаю. Объясните пожалуйста как в приложении...

Отрисовка большого количества треугольников в WPF - C# WPF
При работе в Windows Form мне нужно было выводить сетку из треугольников (около 4757), там при двойной буферизации все выводило за доли...

.NET 4.x Отрисовка графикОВ вручную в реальном времени в WPF - C# WPF
Здравствуйте. (знакомлюсь с wpf) Суть такова: есть функция, в силу вычислений работающая 1-5 сек., где, грубо говоря, изменяются...

Нужны примеры сложных фигур на WPF XAML - C# WPF
У кого нибудь есть примеры сложных фигур на WPF XAML ? ) помимо кубов всяких. Было бы круто, если домик или сфера Добавлено через 29...

.NET 4.x Визуализация, отрисовка графов, деревьев, списков, структур. Библиотеки визуализации под WPF. - C#
Недавно столкнулся с проблемой поиска подходящих средств для отрисовки графов, списков, деревьев и т.п. структур. Слышал про отдельную...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2017, 17:06
Привет! Вот еще темы с ответами:

InkCanvas: изменение инструмента выделения - C# WPF
Здравствуйте. Возникли сложности с поиском способа изменить стандартное лассо для выделения объектов(children) в InkCanvas в режиме...

Обратиться к выбранному элементу InkCanvas - C# WPF
Здравствуйте уважаемые форумчане. Подскажите пожалуйста, на InkCanvas накидано несколько фигур, а вернее Path. Например есть кнопка которая...

Как сохранить фон inkCanvas в файл - C# WPF
Как сохранить фон inkCanvas в файл?

Отмена\возвращение последнего действия на холсте (Undo\Redo) InkCanvas - C# WPF
Доброго дня. Я создаю маркирующую программу по типу Epic Pen, взяв исходники здесь (эта программа является прототипом первой). И я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru