2017-03-20 7 views
1

私は文字列と色を変換して戻ってきましたが、実行時にうまく動作しますが、エディタ上で "Token is not valid"エラーが発生し、エディタが表示されないようにします。これは、ビジュアルエディタを使用できなくなるためです。wpf converter "token is not valid"エディタで、拡張WPFツールキットのColorPicker

拡張WPFツールキットからColorPicker用のコンバータを作成しました。ここで

は、コンバータのコードは次のとおりです。

<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ソースプロパティの種類は何ですか?これは、例えば "#000"のようにColorConverterが実際に理解できる有効な値である必要があります。 – mm8

+0

これは文字列プロパティで、適切な値の辞書を検索するか、デフォルト値を返します。 public string ColoreTestoRGB { get {return PicSettings.GetString( "coloreTestoRGB"); } セット { PicSettings.Set( "coloreTestoRGB"、value); RaisePropertyChanged( "ColoreTestoRGB"); } } – MaddoScientisto

+0

明らかに、例外が発生することなく、文字列 "ColoreTestoRGB"をコンバーターのColorConverter.ConvertFromStringメソッドに渡すことはできません。 – mm8

答えて

2

あなたのMaddoColorConverterに多くのチェックを追加する必要があります。

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からいくつかの関連するスニペットがあります。たとえば、バインディングが失敗した場合、WPFはDependencyProperty.UnsetValueをコンバーターに渡します。あなたのコンバータはこのケースをチェックするのではなく、単に文字列に渡されたものを変換します。何らかの理由でそれが予想される場合

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

:あなたのコンバータは、この(に修正が必要な場合がありますどのConvertBackに手を触れないが、それはこの質問には関係ありませんでしたが、私は唯一のConvert方法を更新しました注意してください)のように変更しますデザイン時に無効な色の値があります。次のように、デザイン時に例外をスローしないでください。

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

関連する問題