none
Рисование в WPF RRS feed

  • Вопрос

  • В процессе решения одной задачи встала необходимость предоставления пользователю возможности рисования в 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