【问题标题】:WPF Setting a Converter's public Image property from xamlWPF 从 xaml 设置转换器的公共图像属性
【发布时间】:2018-06-04 10:59:41
【问题描述】:

我有一个使用转换器的 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 的属性。 'Image' 类型的 'OkImage' 属性不能 指定为字符串。

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

【问题讨论】:

    标签: c# wpf .net-3.5 ivalueconverter


    【解决方案1】:

    不要使用Image(它是一个 UIElement)作为 Convert 方法的返回类型。相反,请使用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();
        }
    }
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 怎么样?能发个样本吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      相关资源
      最近更新 更多