如果我在WPF中有一个Opacity = 0的DrawingVisual,那是否足以让它不被绘制?我们在Canvas上有数百个DrawingVisuals,并且当前在不显示的视觉效果上设置Opacity = 0,并且我想确保在渲染具有Opacity = 0的DrawingVisual时没有渲染渲染性能。
更新:我通过测试发现,当Opacity = 0时会有开销,但由于DrawingVisual没有Visibility属性,我不知道除非你实际删除它否则你会告诉它不显示从视觉树,所以欢迎任何建议。
答案 0 :(得分:2)
检查的最佳方法是将Visibility设置为Visibility.Colapsed,并查看是否存在任何绘图性能差异。
Visibility.Colapsed确保元素不可见,但也不会参与UI的排列,测量和渲染过程,而Opacity = 0的元素可能参与所有过程。
答案 1 :(得分:2)
我使用DrawingGroup
并在DrawingGroup
中添加或删除Drawing
个对象解决了一个非常类似的问题,因为它们需要显示或隐藏。关键是要以易于管理的方式整理您的Drawing
个对象,并了解如何在DrawingGroup
中添加和删除它们。
请记住,您要在DrawingCollection
属性公开的DrawingGroup.Children
中添加和删除Drawing
个对象。因此,请使用DrawingGroup.Children.Add()
或其他DrawingCollection
方法:Insert
,Remove
,RemoveAt
,Clear
。您需要保留添加/删除Drawing
DrawingGroup
对象的外部列表,以便DrawingGroup
成功完成此操作。
我通过将{Image(位图)绘制到Drawing
实例中的第一个子项中,然后将DrawingGroup
个对象添加到Drawing
DrawingGroup
的实例中,使用了这种技术。为了在图形顶部层叠多边形,路径,文本等。
通过在DrawingGroup
的实例中添加或删除Drawing
个对象,在图像上“绘制”或“擦除”。 Drawing
被视为单个DrawingGroup
,因此任何缩放,平移或其他操作都会影响{{1}}中的所有{{1}}个对象。
答案 2 :(得分:1)
最有效的似乎是在我的测试中设置不透明度。另一种简单的方法是重绘受影响的视觉效果。
using (DrawingContext dc = RenderOpen()) {} //Hide this visual
然后再次显示时重绘。
渲染空白的drawingcontext似乎非常快。但是如果你有复杂的视觉效果,那么当它们变得可见时,它们可能需要花费一些时间来重新渲染它们。
答案 3 :(得分:0)
为什么不直接从视觉儿童列表中删除视觉效果?当它需要可见时,你将它添加回来。