2008-11-12 4 views
3

Если у меня есть DrawingVisual в WPF с Opacity = 0, достаточно ли этого, чтобы он не рисовался? У нас есть сотни DrawingVisuals на Canvas и в настоящее время устанавливают Opacity = 0 на визуальные объекты, которые не должны отображаться, и я хотел удостовериться, что нет рендеринга для рендеринга DrawingVisual с Opacity = 0.DrawingVisual performance with Opacity = 0

UPDATE: Я обнаружил, что при использовании Opacity = 0 я обнаружил накладные расходы, но поскольку DrawingVisual не обладает свойством Visibility, я не знаю, как еще вы сказали бы, что он не будет отображаться, если вы не удалите фактический это из визуального дерева, поэтому любые предложения приветствуются.

ответ

1

Наиболее эффективный, по-видимому, устанавливает непрозрачность в моих тестах. Другой простой подход - перерисовать визуальные эффекты, которые затронуты.

using (DrawingContext dc = RenderOpen()) {} //Hide this visual 

И затем перерисовывайте, когда они снова становятся видимыми.

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

2

Лучшим способом проверки было бы установить Visibility на Visibility.Colapsed и посмотреть, есть ли различия в производительности чертежа.

Visibility.Colapsed гарантирует, что элемент не виден, а также что он не будет участвовать в проходах Arrange, Measure и Render пользовательского интерфейса, в то время как элемент с Opacity = 0 может участвовать во всех проходах.

+1

Вопрос был о DrawingVisual, который не имеет свойства Видимость. Этот ответ действителен для cijs UIElement. – keft 2012-08-10 09:48:01

2

Я решил очень похожую проблему, используя DrawingGroup и добавляя или удаляя Drawing объекты из DrawingGroup, поскольку они либо должны отображаться, либо скрываться. Ключ состоит в том, чтобы организовать объекты Drawing таким образом, чтобы их было легко управлять, и чтобы понять, как их добавлять и удалять с DrawingGroup.

Помните, что вы хотите добавить и удалить Drawing объекты из DrawingCollection, выставленные на продажу DrawingGroup.Children. Поэтому используйте DrawingGroup.Children.Add() или другие методы DrawingCollection: Insert, Remove, RemoveAt, Clear. Чтобы сделать это успешно, вам необходимо сохранить внешний список объектов Drawing, которые вы добавляете/удаляете до DrawingGroup.

Я использовал эту технику с большим эффектом при рисовании изображения (Bitmap) в первый ребенок в моем экземпляре DrawingGroup, а затем добавлять и удалять Drawing объектов данного экземпляра DrawingGroup для того, чтобы слой многоугольников, путь, текст и т.д. поверх рисунка.

Я «рисую» или «стираю» на изображении, добавляя или удаляя Drawing объектов к экземпляру DrawingGroup. DrawingGroup рассматривается как один Drawing, и поэтому любое масштабирование, панорамирование или другие манипуляции повлияют на все объекты Drawing в пределах DrawingGroup.

+0

Это выдающийся.Я подозревал, что этот радикально другой способ рисования будет работать в WPF, и ваш пост побудил меня попробовать его. Как вы говорите, ключ должен тщательно планировать, но производительность невыполнима. Подготовьте произвольно глубокое вложение «DrawingGroup`s» для представления возможных состояний срыва/разворота/etc вашей сцены. Вы только вызываете `RenderOpen()` один раз, когда вы инициализируетесь, с единственным вызовом `dc.DrawDrawing (dg)` в корне вашего дерева. Здесь вы можете просто редактировать/управлять деревом (и его дочерние преобразования) - WPF отслеживает и обновляет все автоматически. – 2012-11-26 23:52:28

0

Почему бы просто не удалить визуал из списка визуальных детей? Когда это необходимо, вы добавите его обратно.