这是原来的代码:
<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,问题解决了。