2017-02-14 60 views
1

我想建立一個自定義控件,基於Image,它只是在一個計時器上(從同一個URI)重新加載圖像。原始圖像顯示正常,但似乎沒有刷新。強制WPF BitmapImage從其UriSource重新加載

這裏是自定義控件:

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強制對數據源臨時綁定 綁定進行重新評估t無法實現推薦的INotifyPropertyChanged通知機制 。

提高INotifiyPropertyChanged.PropertyChanged事件的Uri也不會觸發圖像重新加載。

+0

在應用程序中打開圖像時,可以更改(寫入)圖像嗎? – Ron

+0

出於好奇,我試圖看看這是否只適用於UriSource上的簡單數據綁定......它不是。從2006年開始查看線程:https://social.msdn.microsoft.com/Forums/vstudio/en-US/85cffb5c-05a4-4653-a263-183f20ddd2c2/xaml-setting-bitmapimageurisource-from-binding-doesnt-work? forum = wpf似乎UriSource是一次依賴項屬性。隨後的變化似乎什麼都不做 – Schneider

+0

這個問題不是重複的。這個問題是關於爲什麼UriSource一旦設置就無法更改。 – Schneider

回答

0

似乎BitmapSource通常是不可變對象。一旦完成初始化,任何進一步的屬性更改都將被忽略。我懷疑這包括UriSource

此以下階段在此MSDN post on creating custom ImageSources經常重複:

的ISupportInitialize接口接口用於當初始化完成捕捉的 屬性的值。對 屬性的進一步更改將被忽略。

+1

「一旦屬性被設置,它們被凍結」是不正確的。除非實際調用Freeze(),否則BitmapImage不會凍結。實際上,WPF會緩存從URI加載的圖像。如果您要更改Uri視圖模型屬性的值,則綁定將更新BitmapImage的UriSource。 – Clemens

+0

@Clemens「如果您要更改Uri視圖模型屬性的值,那麼綁定會更新BitmapImage的UriSource」< - 不行,它不起作用。親自嘗試一下。 – Schneider

+0

我做到了。當然,Uri值必須不同,並且屬性必須觸發PropertyChanged事件。請注意綁定源屬性(Uri)的更改值並不意味着目標依賴項屬性(UriSource)被設置爲新的*本地值*。它最初一次設置爲綁定,並且稍後不會更改。相反,綁定產生的值會發生變化。 – Clemens