2015-12-31 144 views
1

我想在我的WPF應用程序中有一個旋轉的廣告顯示。當我加載應用程序時,GetNewAd()方法正確顯示廣告。當我嘗試通過再次調用GetNewAd()方法來更新廣告時,chatHost將返回新廣告,但該圖像不會在UI中更新。我試圖更新沒有動畫的圖像,但我仍然有同樣的問題。我在這裏錯過了什麼?WPF圖片來源不更新圖像

public class ncWindow 
{     
    public ncWindow(Grid grid) 
    {   
     imgAd = new Image(); 
     imgAd.Margin = new Thickness(2,2,2,2); 
     imgAd.HorizontalAlignment = HorizontalAlignment.Left; 
     imgAd.MouseDown += imgAd_MouseDown; 

     adTimer.Interval = 60000; 
     adTimer.Elapsed += adTimer_Elapsed; 
     adTimer.AutoReset = true; 
     adTimer.Start(); 

     grid.Children.Add(imgAd);  
    }     

    public void GetNewAd() 
    { 
     DisplayedAd = chatHost.GetNewAd(); 

     debug.Print("GetNewAd: " + DisplayedAd.VendorName + ", ImageData.Length = " + DisplayedAd.ImageData.Length); 

     BitmapImage image = new BitmapImage(); 
     if (DisplayedAd.ImageData!=null && DisplayedAd.ImageData.Length>0) 
     { 
      using (var mem = new MemoryStream(DisplayedAd.ImageData)) 
      { 
       mem.Position = 0;    
       image.BeginInit(); 
       image.CacheOption = BitmapCacheOption.OnLoad; 
       image.StreamSource = mem;    
       image.EndInit();    
      } 
     } 
     else 
      return; 

     image.Freeze();   
     imgAd.Source = image; 
    }  

    private void adTimer_Elapsed(object source, ElapsedEventArgs e) 
    { 
     GetNewAd(); 
    } 
}  
+2

是'imgAd '控件曾經添加到您的用戶界面中的面板?它看起來不像。 – Clemens

+0

它被添加到網格中。我更新了代碼以顯示這是如何完成的。 – Traderman57

+0

您確定DisplayedAd.ImageData始終爲非零且不爲空?並且是UI線程中調用的GetNewAd方法? – Clemens

回答

3

如果調用您的GetNewAd()方法不是DispatcherTimer定時器,你會明確必須調用在UI線程Image控件的Source財產的分配:

image.Freeze(); // necessary for cross-thread access 

imgAd.Dispatcher.BeginInvoke(new Action(() => imgAd.Source = image)); 
+0

這個技巧。謝謝您的幫助!!! – Traderman57