【问题标题】:Handling invalid image source in WPF在 WPF 中处理无效的图像源
【发布时间】:2015-08-31 10:49:36
【问题描述】:

我有一个绑定到视图模型中的字符串资源的视图,它可以很好地与网络上的图像或硬盘图像文件的链接一起工作。但是,如果选择了错误的图像源,由于明显的原因,图像不会显示。我可以做一个绑定来查看图像是否有有效的来源,或者如果来源不好,有没有办法放置默认图像。

ViewModel 中的属性:

    public string ImageSource
    {
        get { return imageSource; }
        set
        {
            imageSource = value;
            NotifyPropertyChange("ImageSource");
        }
    }

Xaml:

<Image Grid.Row="0" Name="picture" Source="{Binding ImageSource}" Height="auto" Width="auto" MaxWidth="750" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"  />

绑定工作正常。

【问题讨论】:

  • 制作一个转换器,检查图像源是否有效,如果无效则返回默认值?
  • 或者只是在公共财产的 setter 或 getter 处验证。
  • 自定义转换器或简单添加到您的 getter:get { if(!File.Exists(imageSource)) { return "default message"; } else { return imageSource; } }(只是一些快速伪代码,您必须为 Web 图像等提供替代逻辑)
  • 好吧,使用的图像源可以像现在一样在线或离线,我想我只需要检查它是否是正确的 Uri

标签: c# wpf


【解决方案1】:

如果 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>

【讨论】:

  • 可以说我更喜欢空字符串,我能做到 value=""
  • 太棒了,这只是与验证器结合使用,这就是我需要的答案,谢谢
  • 顺便提一下,这有一个小的副作用:它会覆盖隐式样式。好吧,您可能没有图像的隐式样式,但对于其他元素它很常见。然后你应该设置显式样式的 BasedOn 属性:&lt;Style BasedOn="{StaticResource {x:Type Image}}"&gt;
【解决方案2】:

Binding 具有完全针对您的场景的 TargetNullValue 属性:

<Image Source="{Binding ImageSource, 
                        TargetNullValue={StaticResource DefaultImage}}" />    

当然,资源必须在某处定义:&lt;BitmapImage x:Key="DefaultImage" UriSource="default_image" /&gt;

【讨论】:

  • 很好,我想,有了这个属性,它基本上就像在马克的回答中那样做数据触发。仍然很高兴知道绑定具有该属性,我敢打赌我可以在多种情况下使用它。
  • 你也可以使用 Converter to 来实现。 XAML 也是代码,您应该保持其简单、可读和可维护。如果你可以用 1 行替换 10 行 xaml 代码,那就去吧
  • 我目前同意该图像,它只是这个地方,但如果项目中出现可重复的问题,我肯定会使用这种方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
相关资源
最近更新 更多