BitmapImage генерирует исключение инициализации, когда файл не существует

1

У меня XAMl вот так

<Image x:Name="MyImage">
    <Image.Source>
        <BitmapImage UriSource="{Binding FullPhotoPath}"   CacheOption="OnLoad" />
    </Image.Source>
</Image>

Это работает отлично, пока существует FullPhotoPath. если нет, то это исключает

Инициализация "System.Windows.Media.Imaging.BitmapImage" сделала исключение.

Я понимаю, что могу использовать только тег Image

Чтобы показать изображение, и если оно не существует, ничего не отображается (и не генерируется исключение), но насколько я могу сказать, этот синтаксис не позволяет мне использовать CacheOption.

Как я могу ничего не показать, если путь к изображению не существует?

  • 0
    Вы пробовали обрабатывать исключения в коде файла? XAML не поддерживает эту функцию
Теги:
wpf

1 ответ

1
Лучший ответ

Вы можете использовать конвертер для создания своего BitmapImage с любыми параметрами, которые вам нужны, которые также могут просто вернуть null, если вы видите, что файл не существует, а затем просто привязывайте Image.Source через конвертер.

public class PathToBitmapImagelConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string path = value as string;

        if (path == null || !File.Exists(path))
            return null;

        var bmp =  new BitmapImage();
        bmp.BeginInit();
        bmp.CacheOption = BitmapCacheOption.OnLoad;
        bmp.UriSource = new Uri(path, UriKind.RelativeOrAbsolute);
        bmp.EndInit();
        return bmp;
    }


    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Сделать конвертер доступным где-нибудь

<local:PathToBitmapImagelConverter x:Key="PathToBitmapImagelConverter"/>

Затем используйте в своем XAML, как

<Image x:Name="MyImage" Source="{Binding FullPhotoPath, Converter={StaticResource PathToBitmapImagelConverter}}"/>
  • 0
    Отлично, попробую конвертер и дам знать
  • 0
    Потрясающие. Однако одно зависание заключается в том, что, устанавливая CacheOption таким образом, он фактически не устанавливается. Это остается по Default . Мне нужно было использовать BeginInit / EndInit чтобы он вступил в силу. Я собираюсь отредактировать ваш ответ, если вы не возражаете.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню