C# 处理WPF中的无效图像源
我有一个视图绑定到viewmodel中的字符串Resource,它可以很好地与web上的图像链接或硬盘图像文件配合使用。但是,如果选择了错误的图像源,由于明显的原因,图像不会显示。是否有一个绑定我可以做,看看图像是否有一个有效的源,或者是否有一种方法来放置一个默认的图像,如果源是坏的 ViewModel中的属性:C# 处理WPF中的无效图像源,c#,wpf,C#,Wpf,我有一个视图绑定到viewmodel中的字符串Resource,它可以很好地与web上的图像链接或硬盘图像文件配合使用。但是,如果选择了错误的图像源,由于明显的原因,图像不会显示。是否有一个绑定我可以做,看看图像是否有一个有效的源,或者是否有一种方法来放置一个默认的图像,如果源是坏的 ViewModel中的属性: public string ImageSource { get { return imageSource; } set
public string ImageSource
{
get { return imageSource; }
set
{
imageSource = value;
NotifyPropertyChange("ImageSource");
}
}
Xaml:
绑定工作正常。如果保证ImageSource对于坏图像为空,则可以使用数据触发器:
<Image Grid.Row="0" Name="picture" Height="auto" Width="auto" MaxWidth="750" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" >
<Image.Style>
<Style TargetType="{x:Type Image}">
<Setter Property="Source" Value="{Binding ImageSource}" />
<Style.Triggers>
<DataTrigger Binding="{Binding ImageSource}" Value="{x:Null}">
<Setter Property="Source" Value="default_image.png" />
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
如果保证坏图像的ImageSource为空,则可以使用数据触发器:
<Image Grid.Row="0" Name="picture" Height="auto" Width="auto" MaxWidth="750" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" >
<Image.Style>
<Style TargetType="{x:Type Image}">
<Setter Property="Source" Value="{Binding ImageSource}" />
<Style.Triggers>
<DataTrigger Binding="{Binding ImageSource}" Value="{x:Null}">
<Setter Property="Source" Value="default_image.png" />
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
绑定的TargetNullValue属性正好针对您的场景:
<Image Source="{Binding ImageSource,
TargetNullValue={StaticResource DefaultImage}}" />
当然,必须在某个地方定义资源:绑定的TargetNullValue属性正好针对您的场景:
<Image Source="{Binding ImageSource,
TargetNullValue={StaticResource DefaultImage}}" />
当然,资源必须在某个地方定义:创建一个转换器,检查图像源的有效性,如果无效,则返回默认值?或者只在公共属性的setter或getter上验证。自定义转换器或对getter的简单添加:get{if!File.ExistsimageSource{return default message;}else{返回imageSource;}}只是一些快速的伪代码,你必须为网络图像提供备用逻辑,所以正确的,使用的图像源可以像现在一样在线或离线,我猜我只需要检查它是否正确,制作一个转换器,检查图像源的有效性,如果无效则返回默认值?或者在setter上验证或公共属性的getter。可以是自定义转换器,也可以是对getter的简单添加:get{if!File.ExistsimageSource{return default message;}else{return imageSource;}}只是一些快速的伪代码,你必须为网络图像提供备用逻辑,所以,对了,使用的图像源可以是在线的,也可以是离线的,就像现在一样,我想我只需要检查它是否正确。让我们说我更喜欢一个空字符串,我能做value=Awesome吗,好吧,这只是做这个与验证器相结合,这就是我需要的答案,谢谢你,只是要提一下,这有一个小的副作用:它会覆盖隐式样式。好吧,你可能没有图像的隐式样式,但对于其他元素,这是很常见的。然后你应该设置显式样式的BasedOn属性:假设我更喜欢空字符串,我可以吗do value=Awesome,这是我需要的答案,这是我需要的答案,谢谢你只是要提到,这有一个小的副作用:它覆盖了隐式样式。嗯,你可能没有图像的隐式样式,但对于其他元素它是很常见的。然后你应该设置exp的BasedOn属性合法风格:很好,我猜,使用这个属性基本上就像在Mark的回答中那样做数据触发器。知道绑定有这个属性仍然很好,我打赌我可以在多种情况下使用这个属性。你也可以使用转换到相同的。XAML也是代码,你应该保持它的简单、可读性和可维护性。如果你可以替换10行xaml代码加1行,去itI我现在同意这个图像,就是这个地方,但是如果项目中出现了可重复的东西,我肯定会使用这个方法尼斯,我想,这个属性基本上就像做数据触发器一样,就像马克的回答一样。知道绑定有这个属性,我还是很高兴,我打赌我可以在多种情况下使用。你也可以使用转换器来转换。XAML也是代码,你应该保持它的简单、可读性和可维护性。如果你可以用一行XAML代码替换10行XAML代码,那就去吧。我目前同意这幅图,它就在这个地方,但是如果项目中出现了可重复的东西,我肯定会使用它使用这种方法