设置Button.Visibility =在Windows Phone 7中可见时,消除不透明蒙版闪烁

时间:2011-12-05 02:45:56

标签: silverlight windows-phone-7

我正在试图找出一种方法来消除我在应用中的某些按钮上设置Visibility = Visible时出现的闪烁效果。

我的应用的ListBox包含约100件商品。我使用DataTemplate为项目设置样式,每个ListItem包含两个Button元素。应用启动时,其中一个按钮元素设置为Visibile,另一个为Collapsed

我也在按钮上使用OpacityMask,使用户可以根据用户的配色方案(浅色或深色)更改颜色。

当我第一次切换按钮的可见性时 - 即。隐藏一个并显示另一个,切换犹豫了一秒,然后不透明蒙版在加载图标图像之前短暂闪烁。结果是你会看到一瞬间暂停,然后是图标周围的白色方块,然后图标会按预期显示。

在此之后,来回切换正常工作,没有延迟或闪烁。

我认为这种效果是由于图片需要加载或其他东西。有没有办法预先加载图像,以便在需要时准备就绪?

还有其他建议吗?

5 个答案:

答案 0 :(得分:2)

如果没有repro项目,这有点难以说清楚,但这里有一些建议。

  1. 您可以随时预加载图像(通过将它们加载到BitmapImage等中),如果这确实是您的问题(然后将图像源设置为这些变量)。如果图像很大,请注意此场景中的内存使用情况!
  2. OpacityMask是邪恶的(在电话上)。我们经常告诉人们 - 由于OpacityMask无法在GPU上计算,我们在软件中完成所有操作,这意味着您的性能会下降(特别是因为它都是在UI线程上完成的)。最佳实践:不要使用OpacityMask。
  3. 如果这是Mango,请确保您拥有正确的CreateOptions,使用DelayCreation对于一般性能来说非常棒但可以有弹出效果,这可能就是您所看到的(因为图像被加载掉了) -thread我们将在加载图像之前显示UI,然后在图像完全加载+解码时重绘。

答案 1 :(得分:1)

这可能是因为您在OpacityMask样式中使用Button,并且您有很多Buttons

GPU无法计算

OpacityMask。它将在您的UI线程上运行并导致重绘。

你可能只想为你的黑暗和光明主题创建两个不同的图像。

答案 2 :(得分:0)

如果变化实际上是人眼可见的,那么您可能没有进行适当的虚拟化。

尝试5-10项,看看问题是否仍然存在?另外,我们需要看一些代码。

答案 3 :(得分:0)

当我将网格嵌套得太深时,我遇到了类似的问题,Silverlight会做多次重绘,然后在用户控件中有太多用户控件时安顿下来。

答案 4 :(得分:0)

我建议将图像转换为XAML路径并使用Fill of PhoneBackgroundBrush或PhoneForegroundBrush来处理主题。您将获得可缩放矢量图像的好处,并且可以完全卸载到GPU