WPF Установка общего свойства Image конвертера из xaml - PullRequest
0 голосов
/ 04 июня 2018

У меня есть приложение WPF, которое использует конвертер:

public class MyResultImageConverter : IValueConverter  
{
    public Image OkImage { get; set; }
    public Image FailImage { get; set; }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null || !(value is MyCustomObject))
        {
            return null;
        }

        Image img = null;
        MyCustomObjectdbr = (MyCustomObject)value;
        switch (MyCustomObjectdbr.Code)
        {
            case (int)MyEnum.OK:
                img = this.OkImage;
                break;

            case (int)MyEnum.NOK:
                img  = this.FailImage;
                break;

            default:
                break;
        }

        return img;
    }

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

Затем в ресурсах окна я делаю:

<myConverters:MyResultImageConverter
     OkImage="/My.Tools.Graphics;component/Images/Accept.png" 
     FailImage="/My.Tools.Graphics;component/Images/Cancel.png"
     x:Key="MyResultImageConverter"/>

Этот конвертер позже используется в DataGridTemplateColumn:

<dg:DataGridTemplateColumn 
                           Width="SizeToCells"
                           IsReadOnly="True">
    <dg:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Image Source="{Binding Path=MyResult, Converter={StaticResource MyResultImageConverter}}" />
        </DataTemplate>
    </dg:DataGridTemplateColumn.CellTemplate>
</dg:DataGridTemplateColumn>

Компилятор выдает ошибку при попытке установить свойство Image для конвертера:

<myConverters:MyResultImageConverter
     OkImage="/My.Tools.Graphics;component/Images/Accept.png" 
     FailImage="/My.Tools.Graphics;component/Images/Cancel.png"
     x:Key="MyResultImageConverter"/>

Более или менее, в переводе написано:

Невозможно присвоить значение"/My.Tools.Graphics;component/Images/Accept.png" для свойства OkImage '.Свойство 'OkImage' типа 'Изображение' нельзя указывать в виде строки.

My.Tools.Graphics - это библиотека DLL, добавленная в мое решение для Visual Studio, которое содержит папку с изображениями, которая содержит изображения PNG..

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Не используйте Image (который является UIElement) в качестве типа возврата метода Convert.Вместо этого используйте ImageSource, который (в отличие от Image) можно назначить свойству Source изображения:

public class MyResultImageConverter : IValueConverter  
{
    public ImageSource OkImage { get; set; }
    public ImageSource FailImage { get; set; }

    public object Convert(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        var customObject = value as MyCustomObject;

        if (customObject == null)
        {
            return null;
        }

        return customObject.Code == MyEnum.OK ? OkImage : FailImage;
    }

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

. В качестве альтернативы Binding Converter вы также можете использовать ImageСтиль с DataTrigger:

<BitmapImage x:Key="OkImage" UriSource="/My.Tools.Graphics;component/Images/Accept.png"/>
<BitmapImage x:Key="FailImage" UriSource="/My.Tools.Graphics;component/Images/Cancel.png"/>
<Style x:Key="ResultImageStyle" TargetType="Image">
    <Setter Property="Source" Value="{StaticResource FailImage}"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding MyResult}" Value="OK">
            <Setter Property="Source" Value="{StaticResource OkImage}"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

...

<DataTemplate>
    <Image Style="{StaticResource ResultImageStyle}"/>
</DataTemplate>
0 голосов
/ 04 июня 2018

Необходимо назначить путь к изображению для свойства Source объекта Image, а не для фактического изображения (URI пути к изображению является String, а не Image).

public class MyResultImageConverter : IValueConverter  
{
    public Image OkImage { get; set; }
    public Image FailImage { get; set; }

    public string OkImagePath { get; set{
         OkImage = new Image();
         OkImage.Source = value;
        }
    }

    public string FailImagePath { get; set{
         FailImage = new Image();
         FailImage.Source = value;
        }
    }

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    if (value == null || !(value is MyCustomObject))
    {
        return null;
    }

    Image img = null;
    MyCustomObjectdbr = (MyCustomObject)value;
    switch (MyCustomObjectdbr.Code)
    {
        case (int)MyEnum.OK:
            img = this.OkImage;
            break;

        case (int)MyEnum.NOK:
            img  = this.FailImage;
            break;

        default:
            break;
    }

    return img;
}

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

А:

<myConverters:MyResultImageConverter
     OkImagePath="/My.Tools.Graphics;component/Images/Accept.png" 
     FailImagePath="/My.Tools.Graphics;component/Images/Cancel.png"
     x:Key="MyResultImageConverter"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...