<Image Source="{Binding MenuIcon}" />
這裏的MenuIcon是string類型,MenuIcon = "/Image/Tux.ico"。
我遇到的問題是,同事已經封裝好的類中的MenuIcon是Icon對象,並不是一個相對或者絕對的路徑,另外WPF裏也沒有可以直接表示Icon對象的控件,而我最終需要實現的功能是動態添加和顯示這些對象。
最初時我是想同事可以把類中值類型改變,但是他們說這樣就需要重寫這個類了。於是我又想是不是可以建一個臨時的存儲變量,把裏面所有的MenuIcon對象都取出來再加以變換,這大概是可行的,不過確實也是加大了開銷。那麼可不可以在伴隨着讀取的時候就直接轉換呢,當然可以,這裏我們或許能在讀取的函數裏再加一個轉換的方法,不過那樣的話,每一個類裏的屬性都要單獨的讀取了,這也挺麻煩的,好在還有另一種方法,WPF的值轉換器。
[ValueConversion(typeof(Icon), typeof(ImageSource))] // Icon是源類型,ImageSource是目標類型。
public class IconConverter : IValueConverter //繼承了 IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
Icon icon = (Icon)value;
Bitmap bitmap = icon.ToBitmap();
IntPtr hBitmap = bitmap.GetHbitmap();
ImageSource bitmapSource =
Imaging.CreateBitmapSourceFromHBitmap(
hBitmap, IntPtr.Zero, Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
return bitmapSource;
}
//下面的函數是爲了實現上面轉換的逆操作的,這裏我們不需要把ImageSource再變成Icon所以沒有寫具體的實現
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
最後把數據再重新綁定一下,
1、添加引用:xmlns:local="clr-namespace:轉換器所在命名空間"
2、添加資源:<local:IconConverter x:Key="iconConverter"/>
3、綁定轉換器數據:<Image Source="{Binding Path=MenuIcon, Converter={StaticResource iconConverter}}" />
OK,問題解決了。
本文鏈接地址爲:http://blog.csdn.net/wushang923/article/details/6614733