1. 程式人生 > >【值轉換器】 WPF中Image數據綁定Icon對象

【值轉換器】 WPF中Image數據綁定Icon對象

方法 class 並不是 tails clas maps 每一個 rom turn

原文:【值轉換器】 WPF中Image數據綁定Icon對象

? ? ? ?這是原來的代碼:

? ? ? ?<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,問題解決了。

【值轉換器】 WPF中Image數據綁定Icon對象