使用来自资源的图像将图像绑定到wpf中的属性

时间:2014-09-18 13:22:26

标签: c# wpf image binding embedded-resource

我的项目中包含了一些照片。

这行代码运行良好:

<Image Stretch="UniformToFill" Source="/Images/OffsetSituations/offsetsituation1.jpg"

但是我必须从VM更改图片,所以我创建了一个绑定到的属性:

private ImageSource _image;
public ImageSource Image
{
    get { return _image; }
    set
    {
        if (_image == value)
            return;
        _image = value;
        RaisePropertyChanged("Image");
    }
}

来自stackoverflow上的另一篇帖子我得到了这段代码并稍微改了一下:

string picture = "offsetsituation1";
if (!string.IsNullOrEmpty(picture))
{
    var image = new BitmapImage(new Uri(String.Format("/Images/OffsetSituations/{0}.jpg", picture), UriKind.Relative));
    image.Freeze(); // -> to prevent error: "Must create DependencySource on same Thread as the DependencyObject"
    Image = image;
}
else
{
    Image = null;
}

现在在xaml中:

<Image Stretch="UniformToFill" Source="{Binding Image}" Margin="5"/>

但是从来没有一张照片。

我在MessageBox.Show(Image.ToString());之后添加Image = image;进行调试。它显示/Images/OffsetSituations/offsetsituation1.jpg,所以路径似乎是正确的。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

WPF为大多数框架类型提供隐式转换器,包括ImageSource

你所要做的就是提供正确的图像路径作为字符串,让隐式转换器完成剩下的工作

所以将Image属性的类型更改为string

例如

public string Image
{
    get { return _image; }
    set
    {
        if (_image == value)
            return;
        _image = value;
        RaisePropertyChanged("Image");
    }
}

并将路径指定为字符串

Image = String.Format("/Images/OffsetSituations/{0}.jpg", picture);

这就是显示图像所需的全部内容,其余部分将由框架处理

隐式转换器在很多地方都很方便,包括这个。