XAML性能:设置画刷的透明通道与FrameworkElement的不透明度比较

6
对于需要半透明白色 (在这种情况下提供类似玻璃的效果) 的给定XAML布局,哪种方法更适合设置透明度?:
1. 设置画刷的alpha通道。例如:#12FFFFFF 2. 设置FrameworkElement本身的不透明度,将画刷留作100%白色。
另外,在WPF(4.0)和Silverlight之间答案是否不同?

从MSDN 文档 - dowhilefor
3个回答

8
MSDN直接获取:

Brushes透明度与元素透明度

当您使用Brush设置元素的填充或描边时,最好设置Brush.Opacity值而不是设置元素的Opacity属性。修改元素的Opacity属性可能会导致WPF创建临时表面。

但无论如何,请注意,您仍然会使渲染管道做更多的工作。透明度意味着必须从多个源中组合像素才能得出最终的RGB值。因此,如果有可能完全删除透明度并改用不透明的画笔进行模拟,则应该这样做。听起来在您的情况下可能不可能,但通常可以。

1

这取决于您要显示多少个对象(以上类型),以及Brush是如何创建的等等...

例如,如果在第一个示例中将brush设置为StaticResource,则只会创建一次,而如果将其设置为字符串Background =“#12FFFFFF”,则每个对象实例化时都会创建一次。尽管影响可以忽略不计,但这本身就会对性能产生影响。

使用Brushes.White并设置不透明度意味着您将使用单个静态刷子实例(White)和不透明度常量,因此创建的对象更少。

找出最好的方法是进行特定测试-您进行了任何分析吗?

编辑:我应该补充说,如果您只创建了一些上述对象,我认为您不需要担心性能。但是,如果有成千上万个,则进行特定测试是明智的。


谢谢。在这种情况下,它是用于包含许多GeometryDrawing对象的相当复杂的绘图。感谢您的回答。 - Neil Barnwell
我认为你可以通过使用虚拟化或调整渲染时使用的基元来获得更显著的性能提升。你看过这些链接吗?http://stackoverflow.com/questions/7710569/best-performing-class-for-drawing-in-wpf/7711139#7711139https://dev59.com/CVvUa4cB1Zd3GeqPvqhS - Dr. Andrew Burnett-Thompson

0

设置 FrameworkElement 的不透明度将设置该 FrameworkElement 的每个子元素的不透明度。如果 FrameworkElement 必须有子元素(按钮、文本框或任何其他项目),则必须选择选项 1。

如果只是一个白色矩形覆盖在某些内容上,我建议选择选项 2,因为比起画刷,动画化不透明度属性更容易,以防您最终需要这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接