如何设置按钮背景没有闪烁?

时间:2013-01-09 00:50:36

标签: xaml windows-8 windows-runtime

我正在尝试将按钮的背景更改为图像源。我想在导航到页面时将该图像加载到内存中,以便它在第一次显示时不会闪烁。

在Windows Phone上,我能够创建图像源:

  StreamResourceInfo resourceInfo = Application.GetResourceStream(uri);
  BitmapImage bitmapSource = new BitmapImage();

  // Avoid flicker by not delay-loading.
  bitmapSource.CreateOptions = BitmapCreateOptions.None;

  bitmapSource.SetSource(resourceInfo.Stream);

  imageSource = bitmapSource;

我在Windows 8商店应用中试过了类似的东西:

  BitmapImage bitmapSource = new BitmapImage();
  bitmapSource.CreateOptions = BitmapCreateOptions.None;
  bitmapSource.UriSource = uri;
  imageSource = bitmapSource;

但出现同样的问题。该按钮已经具有与背景不同的图像,并且在某个事件上我希望它更改为新背景。但是当我改变光源时,会观察到明显的闪烁。我假设这是因为图像还没有在内存中,因为第二次修改图像源时问题就消失了。

有人知道解决方案吗?我需要以某种方式强制加载这个图像。

谢谢!

2 个答案:

答案 0 :(得分:3)

如果在BitmapImage上使用SetSourceAsync方法并在将其附加到图像源之前等待它,则不应看到闪烁: -

// Ensure the stream is disposed once the image is loaded
using (IRandomAccessStream fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
{
    // Set the image source to the selected bitmap
    BitmapImage bitmapImage = new BitmapImage();
    await bitmapImage.SetSourceAsync(fileStream);
    imageSource  = bitmapImage;
}

MSDN文档有关于此

的更多信息

答案 1 :(得分:0)

谢谢罗斯,但我最终做的是通过使用类似的代码来预加载我需要的大约六个位图,当然除了资源之外。我在页面加载时异步执行此操作,然后当我在按钮背景上设置ImageSource时,我使用了已经预加载的位图。这样我知道我没有为位图的每个实例分配一大块内存。