Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理WPF中的无效图像源_C#_Wpf - Fatal编程技术网

C# 处理WPF中的无效图像源

C# 处理WPF中的无效图像源,c#,wpf,C#,Wpf,我有一个视图绑定到viewmodel中的字符串Resource,它可以很好地与web上的图像链接或硬盘图像文件配合使用。但是,如果选择了错误的图像源,由于明显的原因,图像不会显示。是否有一个绑定我可以做,看看图像是否有一个有效的源,或者是否有一种方法来放置一个默认的图像,如果源是坏的 ViewModel中的属性: public string ImageSource { get { return imageSource; } set

我有一个视图绑定到viewmodel中的字符串Resource,它可以很好地与web上的图像链接或硬盘图像文件配合使用。但是,如果选择了错误的图像源,由于明显的原因,图像不会显示。是否有一个绑定我可以做,看看图像是否有一个有效的源,或者是否有一种方法来放置一个默认的图像,如果源是坏的

ViewModel中的属性:

    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代码,那就去吧。我目前同意这幅图,它就在这个地方,但是如果项目中出现了可重复的东西,我肯定会使用它使用这种方法