C# 正在验证运行时从URI加载的WPF位图图像

C# 正在验证运行时从URI加载的WPF位图图像,c#,wpf,xaml,code-behind,bitmapimage,C#,Wpf,Xaml,Code Behind,Bitmapimage,我试图在运行时从URI加载BitmapImage。我在XAML用户控件中使用了一个默认映像,我想通过数据绑定替换它。这很有效 我遇到的问题是,替换映像使用了无效文件(可能是错误的URI,或者URI指定了非映像文件)。发生这种情况时,我希望能够检查BitmapImage对象,以查看它是否已正确加载。如果没有,我想坚持使用默认的图像 以下是XAML: <UserControl x:Class="MyUserControl"> <Grid> <Im

我试图在运行时从URI加载BitmapImage。我在XAML用户控件中使用了一个默认映像,我想通过数据绑定替换它。这很有效

我遇到的问题是,替换映像使用了无效文件(可能是错误的URI,或者URI指定了非映像文件)。发生这种情况时,我希望能够检查BitmapImage对象,以查看它是否已正确加载。如果没有,我想坚持使用默认的图像

以下是XAML:

<UserControl x:Class="MyUserControl">
    <Grid>
        <Image
            x:Name="myIcon"
            Source="Images/default.png" />
    </Grid>
</UserControl>
下面是如何在另一个XAML文件中创建此用户控件的实例:

<!--
  My problem:  What if example.png exists but is not a valid image file (or fails to load)?
-->
<MyUserControl IconPath="C:\\example.png" />


或者有人可以建议一种不同/更好的方式来在运行时加载映像。谢谢。

这已经得到了回答。请看一看和。我认为这两种方法在某种程度上回答了您的问题,但我更喜欢前一种方法,因为它甚至可以检查远程资源的contentType

你也可以看看这个

更新:

对于本地文件,可以通过使用Uri或路径创建图像对象来检查这一点。如果成功,则表示该映像是有效映像:

try
{
    Image image = Image.FromFile(uri);
    image.Dispose();
}
catch (Exception ex)
{
    //Incorrect uri or filetype.
}
你可以试试这张支票

        if (bitmapImage.UriSource==null || bitmapImage.UriSource.ToString()).Equals(""))
        {
            Console.WriteLine("path null");
        }
        else
        {
            bitmapImage.EndInit();
        }

嗯,
BitmapImage
类有两个事件,当下载或解码失败时将引发这两个事件

yourBitmapImage.DownloadFailed += delegate { /* fall to your def image */ }
yourBitmapImage.DecodeFailed += delegate { /* fall to your def img */ }

另一方面,如果您试图实现回退占位符:似乎很好。

这很粗糙,但我发现无效的位图图像的宽度和高度将为0

    BitmapImage image;
    if(image.Width > 0 && image.Height > 0) 
    {  
        //valid image 
    }     

我认为这些解决方案不适用于我的情况,因为我使用的是指向本地文件的URI(HTTP上没有任何内容)。实际上,我在您的第一个链接中尝试了该解决方案,它抛出了一个异常,指出URI前缀无法识别。我使用的URI字符串的类型为:pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml“@RobotNerd你找到解决方案了吗?是的,这是一个黑客攻击,但在我找到更好的解决方案之前,我会使用它。并且不知道为什么BitmapImage.cs没有将CheckCache作为公共方法,或者CreationCompletedDone事件或类似的downloadsuccess和downloadfailed在许多情况下是不够的。当我写这篇文章时,我应该检查宽度>1和高度>1,而不是0。谢谢你的解决方案。
    BitmapImage image;
    if(image.Width > 0 && image.Height > 0) 
    {  
        //valid image 
    }