Как установить FallbackValue в привязке как путь к внешнему файлу изображения?

Я пытаюсь установить FallbackValue в случае, если мой преобразователь не может быть вызван, но я не уверен, как это сделать.

<Image Source="{Binding FallbackValue="Pictures/Unknown.png", Path=LatestPosition.DeviceFamily, Converter={x:Static conv:ConverterSet.DeviceTypeToImageSourceconverter}}" Name="image1" Stretch="Fill" Margin="5,8" Width="150" Height="150" Grid.RowSpan="4" />

Пути внешних изображений в конвертере выглядят так, и когда LatestPosition!=null изображение устанавливается правильно.

private static readonly ImageSource Dev1 = new BitmapImage(new Uri("/Pictures/dev1.png", UriKind.Relative));
private static readonly ImageSource Dev2 = new BitmapImage(new Uri("/Pictures/dev2.png", UriKind.Relative));

person h__    schedule 26.06.2013    source источник
comment
вместо Pictures/Unknown.png укажите полный путь   -  person Shivam cv    schedule 26.06.2013
comment
Да, это решает проблему только тогда, когда файл существует. Какая разница, если я оставлю неизвестный файл, и он будет включен в исполняемый файл, и у меня будет доступ к нему по Uri(/Pic/nam.png) и нет доступа по относительному пути к тому же файлу для FallbackValue?   -  person h__    schedule 27.06.2013


Ответы (2)


Для элемента управления Image при привязке свойства Source к строке URI он автоматически преобразует URI в BitmapImage. Но если вы установите FallbackValue и TargetNullValue как строку URI, она не будет отображаться.

Вам нужно установить его как BitmapImage:

<Window.Resources>
    <BitmapImage x:Key="DefaultImage" UriSource="/Resources;component/Images/Default.jpg" />
</Window.Resources>

<Image Width="128"
               Height="128"
               HorizontalAlignment="Left"
               VerticalAlignment="Top"
               Source="{Binding Photo,FallbackValue={StaticResource DefaultImage},
                                TargetNullValue={StaticResource DefaultImage}}" />

Поскольку мы устанавливаем FallbackValue и TargetNullValue как StaticResource BitmapImage, это работает.

person johnson    schedule 27.08.2013

Для себя я создал следующий пример:

<!-- xmlns:sys="clr-namespace:System;assembly=mscorlib" -->

<Window.Resources>
    <!-- Test data -->
    <local:TestDataForImage x:Key="MyTestData" />

    <!-- Image for FallbackValue -->
    <sys:String x:Key="ErrorImage">pack://application:,,,/NotFound.png</sys:String>

    <!-- Image for NULL value -->
    <sys:String x:Key="NullImage">pack://application:,,,/NullImage.png</sys:String>
</Window.Resources>

<!-- Grid using DataContext -->
<Grid DataContext="{StaticResource MyTestData}">
    <Image Name="ImageNull" Width="100" Height="100" HorizontalAlignment="Left" VerticalAlignment="Bottom" Source="{Binding Path=NullString, TargetNullValue={StaticResource NullImage}}" />

    <Image Name="ImageNotFound" Width="100" Height="100" HorizontalAlignment="Left" VerticalAlignment="Top" Source="{Binding Path=NotFoundString, FallbackValue={StaticResource ErrorImage}}" />
</Grid>

Путь к образам я озвучил в ресурсах. Изображения хранятся в корне проекта. Список MyTestData:

public class TestDataForImage : DependencyObject
{
    public string NotFoundString
    {
        get
        {
            return (string)GetValue(NotFoundStringProperty);
        }

        set
        {
            SetValue(NotFoundStringProperty, value);
        }
    }

    public static readonly DependencyProperty NotFoundStringProperty = DependencyProperty.Register("NotFoundString", typeof(string), typeof(TestDataForImage), new PropertyMetadata(""));

    public string NullString
    {
        get
        {
            return (string)GetValue(NullStringProperty);
        }

        set
        {
            SetValue(NullStringProperty, value);
        }
    }

    public static readonly DependencyProperty NullStringProperty = DependencyProperty.Register("NullString", typeof(string), typeof(TestDataForImage), new PropertyMetadata(""));

    public TestDataForImage()
    {
        NotFoundString = "pack://application:,,,/NotExistingImage.png";
        NullString = null;
    }
}
person Anatoliy Nikolaev    schedule 27.06.2013