2015-10-31 2 views
3

У меня есть DrawingVisual и хочу нарисовать виноградное дерево, показать на экране, после чего нарисовать лису. Как это:WPF DrawingContext: Как сохранить существующий контент при рисовании нового контента?

public class Gif : DrawingVisual 
{ 
    void Draw_Geometry(Geometry geo) 
    { 
     using (DrawingContext dc = RenderOpen()) 
     { 
      dc.DrawGeometry(Brushes.Brown, new Pen(Brushes.Brown, 0), geo); 
     } 
    } 

    void Draw_Grape() 
    { 
     Draw_Geometry(grape); 
    } 

    void Draw_Fox() 
    { 
     Draw_Geometry(fox); 
    } 
} 

Проблема заключается в том, когда вызов Draw_Fox(), то DrawingContext автоматической очистки существующих виноградных деревьев. Поэтому я хочу спросить, как сохранить существующий контент для рисования при рисовании новой геометрии? Спасибо!

ответ

2

Из документации:

При вызове Close метод DrawingContext, текущее содержимое рисунок заменяет любое предыдущее содержимое чертежа, определенного для DrawingVisual. Это означает, что невозможно добавить новый контент чертежа к существующему чертежному контенту.

Я чувствую, что это довольно ясно. Невозможно сделать буквально то, что вы просите. Открытие визуализации для рендеринга будет всегда в конечном итоге с новым рендерингом, заменяющим все, что было раньше.

Если вы хотите добавить текущий рендеринг, вам необходимо включить его явно. Например:

void Draw_Geometry(Geometry geo) 
{ 
    using (DrawingContext dc = RenderOpen()) 
    { 
     dc.DrawDrawing(Drawing); 
     dc.DrawGeometry(Brushes.Brown, new Pen(Brushes.Brown, 0), geo); 
    } 
} 
+0

Спасибо за ответ, это довольно ясно! Все, что мне нужно, - это отображать геометрию один за другим на экране, иначе ничего не делать с ними. У меня есть диаграммы для отображения, поэтому добавьте их так же, как элемент shape/paths не имеет смысла. Теперь одно из решений, которое я знаю, визуализирует «Визуальный» в «RenderTargetBitmap», а затем добавляет это растровое изображение в элемент управления Image. Но сделать это занимает довольно много времени и процессор. Знаете ли вы, что лучше, чем это? – Sakura

+0

@TuyenTk: _ «Знаете ли вы, что-то лучше, чем это» _ - извините ... не хватает более подробной информации, которая была бы слишком широкой, чтобы отвечать даже в качестве фактического вопроса о переполнении стека, неважно, как комментарий. Это зависит от слишком многих разных вещей. Обратите внимание, что в вашем текущем подходе визуальный объект все еще должен хранить график ваших «тысяч геометрий», за исключением объектов «Рисование» (поэтому они на самом деле больше данных, чем просто объекты «Геометрия»). Пользовательский элемент управления может дать вам лучшую производительность (если вы действительно сталкиваетесь с проблемами производительности). –

+0

@TuyenTk: для опции рендеринга в растровое изображение это должно быть _least_ impactful, если это сделано правильно, потому что вам нужно только рисовать в растровое изображение по мере добавления новых объектов; как только они втянуты в растровое изображение, фактическое отображение растрового изображения очень эффективно. Самый большой недостаток заключается в том, что битмап имеет фиксированное количество пикселей/разрешение и поэтому не может вносить изменения в размер окна/контейнера. Но это часто не является недостатком на практике, т. Е. Когда растровое изображение будет отображаться только на одном уровне. –