我的项目中包含了一些照片。
这行代码运行良好:
<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
,所以路径似乎是正确的。
我在这里做错了什么?
答案 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);
这就是显示图像所需的全部内容,其余部分将由框架处理
隐式转换器在很多地方都很方便,包括这个。