如何在wpf中的ImageEdit控件中获取图像文件URL?

wecizke3  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(169)

如何在WPF中的ImageEdit控件中获取图像文件URL?我试过这个代码,但它不工作:

string path = ((BitmapImage)imgEdit.Source).UriSource.AbsolutePath.ToString();

(imgEdit.Source as BitmapImage).UriSource ;
n9vozmp4

n9vozmp41#

我已经有一段时间没有使用DevExpress ImageEdit控件了,但是我以前经常使用他们的WPF库,直到今天我仍然使用他们的MVVM框架。说到这里,我假设你正在使用MVVM,但重要的部分应该是适用的,无论你如何使用WPF。
在没有看到你是如何使用ImageEdit的情况下,很难说,但我猜你实际上需要用户能够编辑图像,因为如果不是这样,你应该只使用标准的Image控件,因为ImageEdit控件并不总是使用Source属性(docs)。但是,您可以使用EditValue来获取(并设置)当前显示的图像为byte[]。已经有一段时间了,我不能确认这一点,因为我没有DevExpress许可证了,但我相信Source属性只是ImageSource,只是用来加载图像到内存中,EditValue是当前显示的实际图像。EditValue是你真正关心的所有编辑控件。
因此,如果你需要实际的文件路径,你应该将Source绑定到ViewModel中的ImageSource,或者你可以将路径绑定为字符串string并使用IValueConverter

<dxe:ImageEdit Source="{Binding ImagePath, Converter={converters:StringToImageSourceConverter}}" />

这里有一个StringToImageSourceConverter,您可以使用它将ImageEditSource绑定到ViewModel中的string

[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();
    }
}

这段代码强调了为什么你(很可能)不能为ImageEdit获取UriSource,因为它只是使用SourceBitmap作为byte[]加载到内存中。
此外,如果您希望能够直接使用转换器而无需创建StaticResource,则可以为其添加MarkupExtension

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();
}

相关问题