Лучший отвечающий
Рисование в WPF

Вопрос
-
В процессе решения одной задачи встала необходимость предоставления пользователю возможности рисования в WPF-приложении. В WinForms рисование осуществляется элементарно и просто: создаем для PictureBox объект Graphics, с помощью которого рисуем линии, эллипсы и т.д. Но как тоже самое сделать на WPF? Посмотрел примеры с разных сайтов(в частности, CodeProject.Com), где показывается рисование с использованием XAML, но это не то. На отечественных сайтах нашел примерно следующие утверждения:"Рисование в WPF осуществляется с помощью ресурсов видеокарты, а не процессора, что очень хорошо. Однако весь этот процесс - это темный лес, ни черта непонятно! Поэтому мы не будем рассматривать данную тему, зачем она нам нужна".
Подскажите пожалуйста, каким образом все таки можно рисовать разнообразные фигуры в WPF в режиме "реального времени"(пользователь выбрал что нарисовать - программа нарисовала)?
С горем пополам нашел в сети следующий код:
LineGeometry MyLine1 = new LineGeometry(new Point(0, 0), new Point(100, 50)); GeometryDrawing MyDrawing = new GeometryDrawing(); MyDrawing.Pen = new Pen(Brushes.Aqua, 1); MyDrawing.Geometry = MyLine1; image1.Source = new DrawingImage(MyDrawing);
Он нормально рисует линию, но если она не вмещается, то не добавляет объекту image1 скроллинги. Как решить данную проблему и неужели нет метода для рисования в WPF по-проще?
- Изменено Maximys33 9 января 2012 г. 23:36
- Перемещено Abolmasov Dmitry 6 февраля 2012 г. 11:48 (От:Языки программирования)
9 января 2012 г. 23:02
Ответы
-
Здравствуйте.
Для рисования в WPF вы можете использовать:
System.Windows.Shapes - определяет фигуры такие как, элипс, прямоугольник, линия... Самый простой и самый медленный вариант рисования.
System.Drawing.Media.Visual - абстрактный базовый класс, предлагает наиболее легковесный подход к визуализации графики, однако требует написания больше всего кода.
System.Windows.Media.Drawing - абстрактный класс, описывающий рисунок в 2-D. Что-то среднее между Shapes и Visual.
Для связи [mail]- Помечено в качестве ответа Maximys33 17 января 2012 г. 8:48
13 января 2012 г. 7:05
Все ответы
-
Ответов так и нет, видимо рисование в WPF - это неведомая никому наука...
За 9 часов работы смог разобраться только с некоторой частью рисования и написать следующие методы:
protected GeometryDrawing PaintEllipse(Int32 Left, Int32 Top, Int32 Width, Int32 Height, Pen Pen) { GeometryDrawing returnedValue = null; EllipseGeometry ellipseGeometry = new EllipseGeometry(new Rect(Left, Top, Width, Height)); returnedValue=new GeometryDrawing(null, Pen, ellipseGeometry); return returnedValue; } protected DrawingGroup PaintParallelogram(Int32 Left, Int32 Top, Int32 Width, Int32 Height, Pen Pen) { DrawingGroup returnedValue = new DrawingGroup(); Point a = new Point(Left + Width / 6, Top); Point b = new Point(Left + Width, Top); Point c = new Point(Left, Top + Height); Point d = new Point(Left + Width - Width/6, Top + Height); LineGeometry lineGeometry1 = new LineGeometry(a, b); LineGeometry lineGeometry2 = new LineGeometry(c, d); LineGeometry lineGeometry3=new LineGeometry(a,c); LineGeometry lineGeometry4=new LineGeometry(b,d); returnedValue.Children.Add(new GeometryDrawing(null, Pen, lineGeometry1)); returnedValue.Children.Add(new GeometryDrawing(null, Pen, lineGeometry2)); returnedValue.Children.Add(new GeometryDrawing(null, Pen, lineGeometry3)); returnedValue.Children.Add(new GeometryDrawing(null, Pen, lineGeometry4)); return returnedValue; } protected GeometryDrawing PaintRectangle(Int32 Left, Int32 Top, Int32 Width, Int32 Height, Pen Pen) { GeometryDrawing returnedValue = null; RectangleGeometry rectangleGeometry=new RectangleGeometry(new Rect(Left, Top, Width, Height)); returnedValue=new GeometryDrawing(null, Pen, rectangleGeometry); return returnedValue; } protected DrawingGroup PaintRhombus(Int32 Left, Int32 Top, Int32 Width, Int32 Height, Pen Pen) { DrawingGroup returnedValue=new DrawingGroup(); Point a = new Point(Left + Width/2, Top); Point b = new Point(Left + Width, Top + Height/2); Point c = new Point(Left+Width/2, Top + Height); Point d = new Point(Left, Top + Height/2); LineGeometry lineGeometry1=new LineGeometry(a, b); LineGeometry lineGeometry2=new LineGeometry(b,c); LineGeometry lineGeometry3=new LineGeometry(c,d); LineGeometry lineGeometry4=new LineGeometry(d,a); returnedValue = new DrawingGroup(); returnedValue.Children.Add(new GeometryDrawing(null, Pen, lineGeometry1)); returnedValue.Children.Add(new GeometryDrawing(null, Pen, lineGeometry2)); returnedValue.Children.Add(new GeometryDrawing(null, Pen, lineGeometry3)); returnedValue.Children.Add(new GeometryDrawing(null, Pen, lineGeometry4)); return returnedValue; } protected DrawingGroup PaintHexagon(Int32 Left, Int32 Top, Int32 Width, Int32 Height, Pen Pen) { DrawingGroup returnedValue = null; Point a = new Point(Left + Width/6, Top); Point b = new Point(Left + Width - Width/6, Top); Point c = new Point(Left + Width, Top + Height/2); Point d = new Point(Left + Width - Width/6, Top + Height); Point e = new Point(Left + Width/6, Top + Height); Point f = new Point(Left, Top + Height/2); LineGeometry lineGeometry1=new LineGeometry(a,b); LineGeometry lineGeometry2=new LineGeometry(b,c); LineGeometry lineGeometry3=new LineGeometry(c,d); LineGeometry lineGeometry4=new LineGeometry(d,e); LineGeometry lineGeometry5=new LineGeometry(e,f); LineGeometry lineGeometry6=new LineGeometry(f,a); returnedValue=new DrawingGroup(); returnedValue.Children.Add(new GeometryDrawing(null, Pen, lineGeometry1)); returnedValue.Children.Add(new GeometryDrawing(null, Pen, lineGeometry2)); returnedValue.Children.Add(new GeometryDrawing(null, Pen, lineGeometry3)); returnedValue.Children.Add(new GeometryDrawing(null, Pen, lineGeometry4)); returnedValue.Children.Add(new GeometryDrawing(null, Pen, lineGeometry5)); returnedValue.Children.Add(new GeometryDrawing(null, Pen, lineGeometry6)); return returnedValue; }
Все отлично рисует, но снова есть проблема: данные методы можно использовать только следующим образом(пример):
image1.Source=new DrawingImage(PaintHexagon(0,0,190,90,new Pen(Brushes.Brown, 2)));
Подскажите: есть ли все таки какой-то способ справиться с данной задачей или она неразрешима средствами WPF(во что лично я не верю)?- Изменено Maximys33 10 января 2012 г. 8:53
10 января 2012 г. 8:51 -
Здравствуйте.
Для рисования в WPF вы можете использовать:
System.Windows.Shapes - определяет фигуры такие как, элипс, прямоугольник, линия... Самый простой и самый медленный вариант рисования.
System.Drawing.Media.Visual - абстрактный базовый класс, предлагает наиболее легковесный подход к визуализации графики, однако требует написания больше всего кода.
System.Windows.Media.Drawing - абстрактный класс, описывающий рисунок в 2-D. Что-то среднее между Shapes и Visual.
Для связи [mail]- Помечено в качестве ответа Maximys33 17 января 2012 г. 8:48
13 января 2012 г. 7:05