2017-03-20 15 views
1

我制作了一个字符串转换为颜色的转换器,并且运行正常,但在编辑器中它只是抛出“令牌无效”。错误,并防止编辑器出现,真的很烦人,因为它阻止我使用可视化编辑器。编辑器中的wpf转换器“令牌无效”,扩展WPF工具包中的ColorPicker

我从扩展的WPF工具包制作ColorPicker的转换器。

这里的转换代码:

public class MaddoColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     Color color = Colors.Black; 

     if (value != null && !string.IsNullOrWhiteSpace(value.ToString())) 
     { 
      string c = value.ToString(); 
      var convertedColor = ColorConverter.ConvertFromString(c); 
      if (convertedColor != null) 
      { 
       color = (Color) convertedColor; 
      } 
     } 

     return color; 

    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value != null) 
     { 
      Color color = (Color)value; 
      Debug.WriteLine(color.ToString()); 
      return color.ToString(); 
     } 
     return string.Empty; 
    } 
} 

这里是从形式XAML一些相关片段:

<Window.Resources>   
    <wpfCatalog:MaddoColorConverter x:Key="ColorConverter" /> 
</Window.Resources> 

<xctk:ColorPicker Grid.Row="3" Grid.Column="2" SelectedColor="{Binding ColoreTestoRGB, Converter={StaticResource ColorConverter}}"/> 
+0

什么是ColoreTestoRGB源属性的类型以及它返回的值是什么?这需要ColorConverter实际理解的有效值,例如“#000”。 – mm8

+0

这是一个字符串属性,它查找字典中的正确值或返回默认值 公共字符串ColoreTestoRGB get {return PicSettings.GetString(“coloreTestoRGB”); } set { PicSettings.Set(“coloreTestoRGB”,value); RaisePropertyChanged(“ColoreTestoRGB”); } } – MaddoScientisto

+0

很明显,您不能将字符串“ColoreTestoRGB”传递给转换器中的ColorConverter.ConvertFromString方法,而不会发生异常。 – mm8

回答

2

你需要更多的检查添加到您的MaddoColorConverter。例如,如果绑定失败,WPF将通过DependencyProperty.UnsetValue到您的转换器。你的转换器不检查这种情况,而只是转换传递给字符串的任何东西。改变你的转换器像这样(请注意,我只更新Convert方法,没有触及ConvertBack可能需要修正,但不相关的这个问题):

public class MaddoColorConverter : IValueConverter { 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
     Color color = Colors.Black; 

     if (value != null && value != DependencyProperty.UnsetValue && value is string && !String.IsNullOrWhiteSpace((string) value)) { 
      string c = (string) value; 
      object convertedColor = null; 
      try { 
       convertedColor = ColorConverter.ConvertFromString(c); 
      } 
      catch (Exception ex) { 
       throw new FormatException($"String {c} does not represent a valid color", ex); 
      } 
      if (convertedColor != null) { 
       color = (Color) convertedColor; 
      } 
     } 

     return color; 
    } 
} 

如果因任何原因,预计在设计时有无效的颜色值 - 请勿在设计时抛出异常,如下所示:

private static readonly DependencyObject _dummy = new DependencyObject(); 
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
    System.Windows.Media.Color color = Colors.Black; 

    if (value != null && value != DependencyProperty.UnsetValue && value is string && !String.IsNullOrWhiteSpace((string) value)) { 
     string c = (string) value; 
     object convertedColor = null; 
     try { 
      convertedColor = ColorConverter.ConvertFromString(c); 
     } 
     catch (Exception ex) { 
      if (!DesignerProperties.GetIsInDesignMode(_dummy)) { 
       throw new FormatException($"String {c} does not represent a valid color", ex); 
      } 
     } 
     if (convertedColor != null) { 
      color = (Color) convertedColor; 
     } 
    } 

    return color; 
} 
+0

修复了无效标记错误,但现在我得到了一个关于不能表示有效颜色的字符串错误,这是有道理的,因为它是查看字典的属性,所以它仅在运行时才有效。 我该如何解决这个问题? – MaddoScientisto

+0

@MaddoScientisto更新了此场景的答案。 – Evk

+0

“_dummy”应该是什么? – MaddoScientisto