【值转换器】 WPF中Image数据绑定Icon对象
2021-07-14 06:16
? ? ? ?这是原来的代码:
? ? ? ?
? ? ? ?这里的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、添加资源:
3、绑定转换器数据:
OK,问题解决了。