【问题标题】:wpf converter "token is not valid" in editor, ColorPicker from extended WPF toolkit编辑器中的 wpf 转换器“令牌无效”,扩展 WPF 工具包中的 ColorPicker
【发布时间】:2017-03-20 09:22:12
【问题描述】:

我做了一个从字符串到颜色并返回的转换器,它在运行时工作正常,但在编辑器上它只是抛出“令牌无效”。错误并阻止编辑器出现,真的很烦人,因为它阻止我使用可视化编辑器。

我使用扩展的 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 格式的相关 sn-ps:

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

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

【问题讨论】:

  • ColoreTestoRGB 源属性的类型是什么,它返回什么值?这需要是 ColorConverter 实际理解的有效值,例如“#000”。
  • 它是一个字符串属性,它在字典中查找正确的值或返回一个默认的公共字符串 ColoreTestoRGB { get { return PicSettings.GetString("coloreTestoRGB"); } set { PicSettings.Set("coloreTestoRGB", value); RaisePropertyChanged("ColoreTestoRGB"); } }
  • 显然您不能将字符串“ColoreTestoRGB”传递给转换器中的 ColorConverter.ConvertFromString 方法而不会出现异常。

标签: c# wpf xaml ivalueconverter wpf-extended-toolkit


【解决方案1】:

您需要向您的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;
}

【讨论】:

  • 修复了无效令牌错误,但现在我得到一个关于字符串不代表有效颜色的错误,这是有道理的,因为它是一个查看字典的属性,所以它是一个有效的颜色仅在运行。我该如何解决?
  • _dummy 应该是什么?
  • 虚拟对象来检查我们是否处于设计模式(看看它是如何使用的)
  • 它就在那里,给我一个未定义的对象错误,我必须在某处声明它吗?
  • 啊抱歉,我复制粘贴的代码错误,确实错过了声明。固定。
猜你喜欢
  • 2015-05-19
  • 2023-03-18
  • 2012-11-12
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多