【问题标题】:Force WPF BitmapImage to reload from its UriSource强制 WPF BitmapImage 从其 UriSource 重新加载
【发布时间】:2022-04-19 16:05:37
【问题描述】:

我正在尝试构建一个基于Image 的自定义控件,它只是在计时器上重新加载图像(从相同的URI)。原始图像显示正常,但似乎没有刷新。

这里是自定义控件:

public class RefreshImage : Image
{
    protected override void OnInitialized(EventArgs e)
    {
        base.OnInitialized(e);
        this.Loaded += RefreshImage_Loaded;
    }

    private void RefreshImage_Loaded(object sender, RoutedEventArgs e)
    {
        var timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromSeconds(1);
        timer.Tick += RefreshImage_Tick;
        timer.Start();
    }

    private void RefreshImage_Tick(object sender, System.EventArgs e)
    {
        var bm = (BitmapImage) Source;
        bm.InvalidateProperty(BitmapImage.UriSourceProperty);
    }
 }

我就是这样使用它的:

  <custom:RefreshImage>
      <Image.Source>
          <BitmapImage UriCachePolicy="NoCacheNoStore"
                       CreateOptions="IgnoreImageCache" CacheOption="None"
                       UriSource="{Binding Uri}"/>
      </Image.Source>
  </custom:RefreshImage>

InvalidateProperty 的文档似乎表明这正是我所需要的:

您还可以使用 InvalidateProperty 强制重新评估 绑定到无法实现的数据源 推荐 INotifyPropertyChanged 通知机制。

Uri 上引发INotifiyPropertyChanged.PropertyChanged 事件也不会触发图像重新加载。

【问题讨论】:

  • 当图像在您的应用程序中打开时,您可以更改(写入)图像吗?
  • 出于好奇,我试图看看这是否仅适用于 UriSource 上的简单数据绑定......它没有。请参阅 2006 年的线程:social.msdn.microsoft.com/Forums/vstudio/en-US/… 似乎 UriSource 是一个 set once 依赖属性。随后的更改似乎无济于事
  • 这个问题不是重复的。这个问题是关于为什么 UriSource 一旦设置就不能更改。

标签: wpf


【解决方案1】:

似乎BitmapSource 通常是不可变对象。一旦它们完成初始化,任何进一步的属性更改都将被忽略。我怀疑这包括UriSource

MSDN post on creating custom ImageSources 中经常重复以下阶段:

ISupportInitialize 接口用于捕捉 初始化完成时的属性。进一步的变化 属性被忽略。

【讨论】:

  • “一旦设置了属性,它们就会被冻结”不是真的。除非您实际调用 Freeze(),否则不会冻结 BitmapImage。事实上,WPF 缓存从 URI 加载的图像。如果您要更改 Uri 视图模型属性的值,Binding 将更新 BitmapImage 的 UriSource。
  • @Clemens “如果您更改 Uri 视图模型属性的值,绑定将更新 BitmapImage 的 UriSource”
  • 我做到了。当然 Uri 值必须不同,并且属性必须触发 PropertyChanged 事件。请注意,绑定源属性 (Uri) 的更改值并不意味着目标依赖项属性 (UriSource) 设置为新的本地值。它最初设置为 Binding,以后不会更改。相反,由 Binding 产生的值会发生变化。
  • 我尝试将绑定的 Uri 设置为不同的东西。正如我所说,它不起作用。我不确定你对我做的有什么不同。绑定可能会产生不同的值,但它会被 BitmapImage 忽略或引发异常。这是一个示例项目,证明它不起作用:expirebox.com/download/9da54d9e5e1f8004ba65ba26e0a5b77b.html
  • 不确定我在那里测试了什么。很确定你在那个示例项目中做了什么。我稍后会检查它。
猜你喜欢
  • 2015-06-26
  • 2010-09-10
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
相关资源
最近更新 更多