[ValueConversion(typeof(string), typeof(ImageSource))]
public class StringToImageSourceConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is not string path) return null;
if (!File.Exists(path)) return null;
using var bmp = new Bitmap(path);
using var ms = new MemoryStream();
bmp.Save(ms, bmp.RawFormat);
ms.Seek(0, SeekOrigin.Begin);
var img = new BitmapImage();
img.BeginInit();
img.CacheOption = BitmapCacheOption.OnLoad;
img.StreamSource = ms;
img.EndInit();
return img;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class StringToImageSourceConverterExtension : MarkupExtension
{
public IValueConverter ItemConverter { get; set; }
public StringToImageSourceConverterExtension() { }
public StringToImageSourceConverterExtension(IValueConverter itemConverter) => ItemConverter = itemConverter;
public override object ProvideValue(IServiceProvider serviceProvider) => new StringToImageSourceConverter();
}
1条答案
按热度按时间n9vozmp41#
我已经有一段时间没有使用DevExpress
ImageEdit
控件了,但是我以前经常使用他们的WPF库,直到今天我仍然使用他们的MVVM框架。说到这里,我假设你正在使用MVVM,但重要的部分应该是适用的,无论你如何使用WPF。在没有看到你是如何使用
ImageEdit
的情况下,很难说,但我猜你实际上需要用户能够编辑图像,因为如果不是这样,你应该只使用标准的Image
控件,因为ImageEdit
控件并不总是使用Source
属性(docs)。但是,您可以使用EditValue
来获取(并设置)当前显示的图像为byte[]
。已经有一段时间了,我不能确认这一点,因为我没有DevExpress许可证了,但我相信Source
属性只是ImageSource
,只是用来加载图像到内存中,EditValue
是当前显示的实际图像。EditValue
是你真正关心的所有编辑控件。因此,如果你需要实际的文件路径,你应该将
Source
绑定到ViewModel中的ImageSource
,或者你可以将路径绑定为字符串string
并使用IValueConverter
。这里有一个
StringToImageSourceConverter
,您可以使用它将ImageEdit
Source
绑定到ViewModel中的string
。这段代码强调了为什么你(很可能)不能为
ImageEdit
获取UriSource
,因为它只是使用Source
将Bitmap
作为byte[]
加载到内存中。此外,如果您希望能够直接使用转换器而无需创建
StaticResource
,则可以为其添加MarkupExtension
。