XAML 性能:设置画笔的 Alpha 通道与 FrameworkElement 的不透明度

发布于 2024-12-09 03:50:50 字数 221 浏览 0 评论 0原文

对于需要半透明白色的给定 XAML 布局(在本例中提供类似玻璃的效果),哪种方法更适合设置透明度?为什么?:

  1. 设置画笔的 Alpha 通道。例如 #12FFFFFF
  2. 设置 FrameworkElement 本身的不透明度,使画笔保持 100% 白色。

另外,WPF (4.0) 和 Silverlight 之间的答案是否不同?

For a given XAML layout that requires a semi-transparent white (to provide a glass-like effect in this case), which method would be preferable to set the transparency and why?:

  1. Set the alpha channel of the brush. E.g. #12FFFFFF
  2. Set the opacity of the FrameworkElement itself, leaving the brush as 100% white.

Also, is the answer different between WPF (4.0) and Silverlight?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

夏日浅笑〃 2024-12-16 03:50:50

直接来自 MSDN

画笔的不透明度与元素的不透明度

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

但无论如何,请注意,您仍然会导致渲染管道执行更多工作。不透明度意味着它必须组合来自多个源的像素才能得出最终的 RGB 值。因此,如果可以完全删除透明度并使用不透明画笔模拟它,那么您应该这么做。听起来这对于你的情况来说可能是不可能的,但通常是可以的。

Straight from MSDN:

Opacity on Brushes versus Opacity on Elements

When you use a Brush to set the Fill or Stroke of an element, it is
better to set the Brush.Opacity value rather than the setting the
element's Opacity property. Modifying an element's Opacity property
can cause WPF to create a temporary surface.

But regardless, note that you're still causing the rendering pipeline to do more work. Opacity implies it must combine pixels from multiple sources in order to come up with the final RGB value. Thus, if it's at all possible to remove the transparency altogether and instead simulate it with an opaque brush, you should. It sounds like that may not be possible in your case, but it often can be.

想你只要分分秒秒 2024-12-16 03:50:50

这取决于您要显示多少个对象(上述类型)、如何创建画笔等...

例如,如果在第一个示例中将画笔设置为 StaticResource,则它会创建一次,而如果它被设置为字符串Background =“#12FFFFFF”,然后每次对象实例化时都会创建一次。仅此一点就会对性能产生影响,尽管

使用 Brushes.White 和设置不透明度可以忽略不计,这意味着您将使用画笔的单个静态实例(白色)和不透明度常量,因此您创建的对象更少。

找出心理的最好方法是进行特定的测试——你做过任何分析吗?

编辑:如果您只创建上述几个对象,我应该补充一点,我认为您不需要担心性能。然而,对于 1000 的具体测试是明智的

it depends on how many objects you are going to display (of the above type), how the Brush is created etc...

For instance, if the brush is set in the 1st example as a StaticResource then it is created once, whereas if it is set as a string Background="#12FFFFFF" then it will be created once per instantiation of the object. That alone will have a performance impact, although negligible

Using Brushes.White and setting opacity means you'll be using a single static instance of a brush (White) and opacity constant so you're creating less objects.

Best way to find out mind is a specific test - have you done any profiling?

Edit: I should add if you're only creating a few of the above objects I don't think you need worry about performance. For 1000's however a specific test would be wise

情感失落者 2024-12-16 03:50:50

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

如果它只是一个覆盖某些内容的白色矩形,我会说使用选项 2,因为为不透明度属性设置动画更容易而不是刷子,以防万一你最终想要它。

Setting the Opacity of a FrameworkElement will set the Opacity of every child of that FrameworkElement. If the FrameworkElement must have children (buttons, textboxes, or any other items) you must go with option 1.

If it is only a white rectangle overlaying something, I'd say go for option 2, because it's easier to animate a Opacity property than a brush, in case you would eventually want that.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文