当前位置:  开发笔记 > 开发工具 > 正文

图像UriSource和数据绑定

如何解决《图像UriSource和数据绑定》经验,为你挑选了5个好方法。

我正在尝试将自定义对象列表绑定到WPF图像,如下所示:


    
        
    

但它不起作用.这是我得到的错误:

必须设置"Property'UriSource'或属性'StreamSource'."

我错过了什么?



1> Brian Leahy..:

WPF具有某些类型的内置转换器.如果将Image的Source属性绑定到string或者Uri值,则WPF将使用ImageSourceConverter将值转换为ImageSource.

所以


如果ImageSource属性是图像的有效URI的字符串表示,则会起作用.

您当然可以使用自己的Binding转换器:

public class ImageConverter : IValueConverter
{
    public object Convert(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        return new BitmapImage(new Uri(value.ToString()));
    }

    public object ConvertBack(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

并像这样使用它:



(实际上类型转换器不会创建`BitmapImage`,而是`ImageSource`的另一个子类:`BitmapFrameDecode`,它是内部的.)

2> Drew Noakes..:

Atul Gupta 撰写的这篇文章包含几个场景的示例代码:

    在XAML中绑定到Source属性的常规资源图像

    绑定资源图像,但从后面的代码

    使用Application.GetResourceStream绑定代码中的资源图像

    通过内存流从文件路径加载图像(从数据库加载博客图像数据时同样适用)

    从文件路径加载图像,但通过使用绑定到文件路径属性

    将图像数据绑定到内部通过依赖属性进行图像控制的用户控件

    与第5点相同,但也确保文件不会被锁定在硬盘上



3> palehorse..:

您也可以简单地设置Source属性而不是使用子元素.为此,您的类需要将图像作为位图图像返回.这是我做过的一种方式的例子


而class属性就是这个

public object ImageSource {
    get {
        BitmapImage image = new BitmapImage();

        try {
            image.BeginInit();
            image.CacheOption = BitmapCacheOption.OnLoad;
            image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
            image.UriSource = new Uri( FullPath, UriKind.Absolute );
            image.EndInit();
        }
        catch{
            return DependencyProperty.UnsetValue;
        }

        return image;
    }
}

我想它可能比价值转换器多一点工作,但它是另一种选择.



4> Dale Ragan..:

您需要具有IValueConverter接口的实现,该接口将uri转换为图像.您的IValueConverter的Convert实现将如下所示:

BitmapImage image = new BitmapImage();
image.BeginInit();
image.UriSource = new Uri(value as string);
image.EndInit();

return image;

然后,您需要在绑定中使用转换器:


    
        
    



5> Luis Cantero..:

这里选择的答案问题是,当来回导航时,每次显示页面时都会触发转换器.

这会导致连续创建新文件句柄,并阻止任何删除文件的尝试,因为它仍在使用中.这可以使用Process Explorer进行验证.

如果某个时候可能删除了图像文件,可能会使用这样的转换器: 使用XAML将System.Drawing.Image绑定到System.Windows.Image控件中

这种内存流方法的缺点是每次都会加载和解码图像,并且不会发生缓存:"为了防止图像被多次解码,请从Uri分配Image.Source属性而不是使用内存流"来源:"使用XAML的Windows应用商店应用的性能提示"

为了解决性能问题,可以使用存储库模式来提供缓存层.缓存可能发生在内存中,这可能会导致内存问题,或者作为缩略图文件驻留在临时文件夹中,可以在应用程序退出时清除.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有