2010-07-11 74 views
1

我如何DataBind我的圖像控件自動獲取player.PlayerImage更新?正如你可以從我的代碼中看到的,我試圖設置數據綁定,但它不起作用。WPF - DataBinding ImageSource

下面是我的當前設置:

我有一個名爲CDGPlayer CLR類實現INotifyPropertyChanged

CDGPlayer類有一個叫做PlayerImage

private Image playerImage; 
public Image PlayerImage 
{ 
    get { return playerImage; } 
    set 
    { 
     if (value != playerImage) 
     { 
      playerImage = value; 
      NotifyPropertyChanged("PlayerImage"); 
     } 
    } 
} 

我有一個WPF客戶端,我想用CDGPlayer屬性。

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:CDG="clr-namespace:GoldenKaraokeLib.CDG;assembly=GoldenKaraokeLib" 
    xmlns:local="clr-namespace:GoldenKaraokePlayerWPF" 
    x:Class="GoldenKaraokePlayerWPF.Window1" 
    Title="Window1" Height="300" Width="654" 
     x:Name="CDGPlayerHost" Loaded="CdgPlayerHostLoaded" Background="#FFCD6F6F"> 
    <Window.Resources> 
     <local:CdgImageConverter x:Key="CDGImageConverter"/> 
    </Window.Resources> 
    <Grid> 
     <Grid.DataContext> 
      <CDG:CDGPlayer x:Name="player"/> 
     </Grid.DataContext> 
     <Border BorderBrush="Black" BorderThickness="5"> 
      <Image x:Name="CDGImage" Source="{Binding PlayerImage, Converter={StaticResource CDGImageConverter}, UpdateSourceTrigger=PropertyChanged}"/> 
     </Border> 
    </Grid> 
</Window> 
在Window1.cs

文件我有一個Loaded事件調用CDGPlayer類的實例,並調用Play方法。此方法會生成一個新的System.Drawing.Image並將其存儲在PlayerImage中。

我知道CDGImage Source屬性無法接受System.Drawing.Image,因此我試圖編寫一個粗略的轉換器。但是,這隻在窗口加載時調用一次。

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    try 
    { 
     MemoryStream ms = new MemoryStream(); 
     Image bitmap = value as Image; 
     BitmapImage bi = new BitmapImage(); 

     if (bitmap != null) 
     { 
      bitmap.Save(ms, ImageFormat.Bmp); 

      bi.BeginInit(); 
      bi.StreamSource = ms; 
      bi.EndInit(); 
     } 

     return bi; 
    } 
    catch 
    { 
     return new BitmapImage(); 
    } 
} 

我在做什麼錯?

回答

2

當我嘗試時,你的綁定似乎是正確的。它看起來像你的轉換器有一個錯誤,但。您不倒帶流,因此BitmapImage將嘗試從結尾開始讀取,而不是從頭開始。添加致電Stream.Seek的電話:

if (bitmap != null) 
{ 
    bitmap.Save(ms, ImageFormat.Bmp); 
    ms.Seek(0, SeekOrigin.Begin); // Set position back to the start of the stream 
    bi.BeginInit(); 
    bi.StreamSource = ms; 
    bi.EndInit(); 
} 
+0

這樣做的竅門。謝謝! – 2010-07-11 15:25:09