WPF 从 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();
}
}

然后在窗口资源中,我这样做:

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

或多或少,翻译过来是:

无法分配值"/我的工具图形;组件/图像/接受.png" 到OkImage'属性。类型为"图像"的"OkImage"属性不能 指定为字符串。

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

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

作为绑定转换器的替代方法,您还可以使用带有数据触发器的图像样式:

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

您需要将图像路径分配给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"/>

最新更新