2015-12-23 3 views
0

У меня есть несколько функций, возвращающих объект System.Windows.Media.DrawingVisual. Мне нужно объединить весь объект DrawingVisual в одно изображение.Как объединить несколько объектов System.Windows.Media.DrawingVisual в одно изображение в WPF?

private System.Windows.Media.DrawingVisual Shape1() 
{ 
    DrawingVisual dv = new DrawingVisual(); 
    using (DrawingContext dc = dv.RenderOpen()) 
    { 
     ////--- draw shapes on 'dc' 
    } 
    return dv; 
} 

private System.Windows.Media.DrawingVisual Shape2() 
{ 
    DrawingVisual dv = new DrawingVisual(); 
    using (DrawingContext dc = dv.RenderOpen()) 
    { 
     ////--- draw shapes on 'dc' 
    } 
    return dv; 
} 

В моей функции мне нужно объединить возвращаемые объекты, такие как следующий

private void Combine() 
{ 
    System.Windows.Media.DrawingVisual s1 = Shape1(); 
    System.Windows.Media.DrawingVisual s2 = Shape2(); 

    //--- here i need to draw the s1 & s2 into an image and display on screen. 
} 

еще один способ есть, сохранить все DrawingVisuals в отдельный объект BitmapSource затем создать еще один DrawingVisual и сделать все растровые изображения на них. Но это очень сложный путь. Есть ли лучший способ сделать это?

+0

Нужно ли вам использовать 'DrawingVisual'? Лучше всего, чтобы ваши методы возвращали объекты «GeometryDrawing» (или даже объекты, полученные из «Геометрии»). Объекты «GeometryDrawing» могут быть объединены с помощью «DrawingGroup», который затем может быть установлен как свойство «Drawing» для «DrawingBrush», которое, в свою очередь, может использоваться так же, как и другие кисти WPF. –

+0

Что вы подразумеваете, комбинируя? – AnjumSKhan

+0

Добавьте их в коллекцию 'Children' ContainerVisual (или другой DrawingVisual). Если вам нужно растровое изображение, используйте RenderTargetBitmap для отображения ContainerVisual. В противном случае создайте элемент управления Visual Host, который отобразит ContainerVisual на экране. – Clemens

ответ

0

Refactor (метод экстракта) в

рисовать фигуры на 'постоянный ток'

части вашей формы возвращающейся методу в Action<DrawingContext>.

Затем используйте подошвуDrawingContext, чтобы вызвать все эти действия, как показано ниже. Создайте ImageSource для назначения вашему Image.

public static BitmapSource CreateBitmap(int width, int height, double dpi, 
    IEnumerable<Action<DrawingContext>> renderActions) 
{ 
    DrawingVisual drawingVisual = new DrawingVisual(); 

    using (DrawingContext drawingContext = drawingVisual.RenderOpen()) 
    { 
     foreach (var render in renderActions) 
      render(drawingContext); 
    } 

    RenderTargetBitmap bitmap = new RenderTargetBitmap(
     width, height, dpi, dpi, PixelFormats.Default); 

    bitmap.Render(drawingVisual); 

    return bitmap; 
}