WPF 设置转换器的 public 图片 属性 来自 xaml

WPF Setting a Converter's public Image property from xaml

我有一个使用转换器的 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();
    }
}

然后在 window 资源中我做:

<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>

编译器在尝试为转换器设置图像 属性 时抛出错误:

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

或多或少,翻译成这样:

Cannot assign value "/My.Tools.Graphics;component/Images/Accept.png" to OkImage' Property. The 'OkImage' property of type 'Image' cannot be specified as a string.

My.Tools.Graphics 是添加到我的 visual studio 解决方案中的一个 DLL,其中包含一个名为 Images 的文件夹,其中包含 png 图像。

您需要将图像路径分配给 Image 对象的 Source 属性 而不是实际图像(图像路径 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"/>

不要使用 Image(它是一个 UIElement)作为 Convert 方法的 return 类型。相反,使用 ImageSource,它(与图像相反)可以分配给图像的 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();
    }
}

作为绑定转换器的替代方案,您还可以使用带有 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>