在WPF中,我可以处理XAML异常吗?比如,当图像试图加载零字节的内容时?

在WPF中,我可以处理XAML异常吗?比如,当图像试图加载零字节的内容时?,wpf,image,xaml,exception-handling,Wpf,Image,Xaml,Exception Handling,当我的XAML包含以下内容时,出现“未找到适合完成此操作的成像组件”错误: <Image x:Name="ProcessImage" Grid.Row="0" Stretch="Uniform"> <Image.Source> <BitmapImage CacheOption="OnLoad" UriSource="{Binding FilePath}"/> </Image.Source>

当我的XAML包含以下内容时,出现“未找到适合完成此操作的成像组件”错误:

   <Image x:Name="ProcessImage" Grid.Row="0"  Stretch="Uniform">
       <Image.Source>
           <BitmapImage CacheOption="OnLoad" UriSource="{Binding FilePath}"/>
       </Image.Source>
   </Image>


因为文件路径指向一个零字节的图像。我怎么能让它在不破坏一切的情况下什么都不显示呢?

你可以这样做;如果图像为空/空,则替换为您知道的空图像

<Image x:Name="ProcessImage" Grid.Row="0"  Stretch="Uniform">
<Image.Style>
    <Style TargetType="{x:Type Image}">
        <Setter Property="Source" Value="{Binding FilePath}" /> 
        <Style.Triggers>
            <DataTrigger Binding="{Binding FilePath}" Value="{x:Null}">
                <Setter Property="Source" Value="~/images/noImg.jpg"  />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Image.Style>
</Image>


试一试

我不认为这种情况可以优雅地处理,但是,基本上,你有两个合适的选择和一种技巧可以尝试:

  • 在绑定声明中使用一个
    FallbackValue
    :这个不错的选项允许您在绑定未成功的情况下指定一个替代选项(实际上,如果
    路径
    值转换器
    不正确)
一个例子;在这种情况下,图像不会显示任何内容,不会出现错误,因为
UriSource
设置正确:

<BitmapImage CacheOption="OnLoad" UriSource='{Binding FilePath, FallbackValue=""}'/>
在这种情况下,解析逻辑将是
FilePath
->
Whatever1
->
Whatever2

  • 最后,您可以使用hack:将异常处理逻辑放入自定义
    ValueConverter
    ,如果图像正确,则返回位图数据,或者,如果出现问题,返回图像占位符(可能是有趣的HTTP 404错误图像)

如果您只想在文件为空或甚至不存在时使其不显示任何内容,您可以直接绑定
Image.Source
属性,而不是显式创建
位图图像

<Image x:Name="ProcessImage" Source="{Binding FilePath}" />


WPF的内置类型转换将从路径字符串或Uri自动创建一个
BitmapFrame

如果返回null,则有TargetNullValue或转换器等。我忘记了零字节确切返回的内容,甚至可能是DataTrigger。您只需要获取该值,如果它符合该条件,则可以使用占位符加载它,甚至可以将其全部折叠在一起。如果我在URI源上使用转换器,当我注意到它指向空文件时,我将返回什么?我试图在图像本身上使用可见性转换器,但似乎Image.source内部XAML仍在执行并引发异常
<Image x:Name="ProcessImage" Source="{Binding FilePath}" />