【值轉換器】 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,問題解決了。

本文鏈接地址爲:http://blog.csdn.net/wushang923/article/details/6614733

發佈了66 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章