3

実行時に URI から BitmapImage をロードしようとしています。XAML ユーザー コントロールで既定の画像を使用しており、これをデータ バインディングで置き換えたいと考えています。これは機能します。

私が抱えている問題は、置換画像に無効なファイルが使用されている状況にあります (おそらく、URI が間違っているか、URI が画像以外のファイルを指定している可能性があります)。これが発生した場合、BitmapImage オブジェクトをチェックして、正しく読み込まれたかどうかを確認できるようにしたいと考えています。そうでない場合は、使用されているデフォルトの画像に固執したいと思います。

XAML は次のとおりです。

<UserControl x:Class="MyUserControl">
    <Grid>
        <Image
            x:Name="myIcon"
            Source="Images/default.png" />
    </Grid>
</UserControl>

関連する分離コード:

public static readonly DependencyProperty IconPathProperty =
    DependencyProperty.Register(
        "IconPath",
        typeof(string),
        typeof(MyUserControl),
        new PropertyMetadata(null, new PropertyChangedCallback(OnIconPathChanged)));

public string IconPath
{
    get { return (string)GetValue(IconPathProperty); }
    set { SetValue(IconPathProperty, value); }
}

private static void OnIconPathChanged(
    object sender,
    DependencyPropertyChangedEventArgs e)
{
    if (sender != null)
    {
        // Pass call through to the user control.
        MyUserControl control = sender as MyUserControl;
        if (control != null)
        {
            control.UpdateIcon();
        }
    }
}

public void UpdateIcon()
{
    BitmapImage replacementImage = new BitmapImage();

    replacementImage.BeginInit();
    replacementImage.CacheOption = BitmapCacheOption.OnLoad;

    // Setting the URI does not throw an exception if the URI is
    // invalid or if the file at the target URI is not an image.
    // The BitmapImage class does not seem to provide a mechanism
    // for determining if it contains valid data.
    replacementImage.UriSource = new Uri(IconPath, UriKind.RelativeOrAbsolute);

    replacementImage.EndInit();

    // I tried this null check, but it doesn't really work.  The replacementImage
    // object can have a non-null UriSource and still contain no actual image.
    if (replacementImage.UriSource != null)
    {
        myIcon.Source = replacementImage;
    }
}

別の XAML ファイルでこのユーザー コントロールのインスタンスを作成する方法を次に示します。

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

または、誰かが実行時にイメージをロードするための別の/より良い方法を提案できるかもしれません。ありがとう。

4

4 に答える 4

1

大雑把ですが、無効な BitmapImage の幅と高さが 0 になることがわかりました。

    BitmapImage image;
    if(image.Width > 0 && image.Height > 0) 
    {  
        //valid image 
    }     
于 2016-03-10T23:43:17.487 に答える
0

このチェックを試すことができます

        if (bitmapImage.UriSource==null || bitmapImage.UriSource.ToString()).Equals(""))
        {
            Console.WriteLine("path null");
        }
        else
        {
            bitmapImage.EndInit();
        }
于 2015-03-10T05:21:30.473 に答える
-2

これはすでに答えられています。これこれを見てください。どちらもあなたの質問にいくらか答えると思いますが、リモートリソースのcontentTypeもチェックするので、前者のアプローチをお勧めします。

この投稿もご覧ください。

アップデート:

ローカルファイルの場合、これは、URIまたはパスを使用してImageオブジェクトを作成するだけで確認できます。成功した場合は、その画像が有効な画像であることを意味します。

try
{
    Image image = Image.FromFile(uri);
    image.Dispose();
}
catch (Exception ex)
{
    //Incorrect uri or filetype.
}
于 2012-04-20T07:48:51.783 に答える