2016-08-10 12 views
0

Ich habe ein Textfeld zur Eingabe und Anzeige der Farbe Hex-Wert erstellt. Die Bindung ist zweifach zu einer Farbeigenschaft eines Elternteils.Überprüfen Sie, ob die Hex-Zeichenfolge im Konverter korrekt ist.

Alles funktioniert, aber ich muss sicherstellen, dass, wenn ich manuell ein Hex in das Textfeld eingeben, und wenn dies eine nicht korrekte Zeichenfolge ist, verwenden Sie und zeigen Sie den aktuellen Hex-Wert der Farbe, anstatt zu versuchen um es zu ändern.

Hier ist, was ich versuchte, aber offensichtlich funktioniert es nicht, ich bin ein Anfänger und ich habe nur ein wenig Erfahrung mit Konverter und WPF. Wenn ich etwas anderes als eine gültige Hex-Zeichenfolge schreibe, erhält das Textfeld im Moment eine rote Umrandung, aber ich wünschte, dass in diesem Fall die vorherige Hex-Zeichenfolge wieder erscheint.

[ValueConversion(typeof(Color), typeof(String))] 
public class ColorToStringConverter : IValueConverter 
{ 
    public Object Convert(Object value, Type targetType, Object parameter, CultureInfo culture) 
    { 
     Color colorValue = (Color)value; 
     return ColorNames.GetColorName(colorValue); 
    } 
    public Object ConvertBack(Object value, Type targetType, Object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

public class ColorHexConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var hexCode = System.Convert.ToString(value); 

     //if (string.IsNullOrEmpty(hexCode)) 
     // return null; 
     try 
     { 
      var color = (Color)ColorConverter.ConvertFromString(hexCode); 
      return color; 
     } 
     catch 
     { 
      return null; 
     } 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var hexCode = System.Convert.ToString(value); 
     Regex myRegex = new Regex("^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$"); 
     bool isValid = false; 
     if (string.IsNullOrEmpty(hexCode)) 
     { 
      isValid = false; 
     } 
     else 
     { 
      isValid = myRegex.IsMatch(hexCode); 
     } 

     try 
     { 
      return hexCode; 
     } 
     catch 
     { 
      return null; 
     } 
    } 
} 

Und die C# Klasse für die TextBox

public class ColorHex : TextBox 
{ 
    protected override void OnKeyDown(KeyEventArgs e) 
    { 
     base.OnKeyDown(e); 

     if (e.Key == Key.Enter) 
     { 
      BindingExpression bindingExpression = BindingOperations.GetBindingExpression(this, TextProperty); 
      if (bindingExpression != null) 
       bindingExpression.UpdateSource(); 
     } 
    } 
} 

Und seine XAML in generic.xaml

<local:ColorHex x:Name="PART_ColorHex" Style="{StaticResource ColorPickerTextBox}" Text="{Binding SelectedColor, Converter={StaticResource ColorToHexConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:ColorPicker}}}" /> 

Jede Idee?

danke

+0

Bitte zeigen Sie auch Ihre XAML. – toadflakz

+0

Bitte definieren Sie "nicht funktioniert". Was läuft falsch und wo? – ChrisF

+0

ok Ich habe mehr Infos hinzugefügt – lecloneur

Antwort

0

Eine gültige hex Farbe hat die Form '#nnn' oder '#nnnnnn'.
So würde die regex für diesen Fall sein: (^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$) jETzT, können Sie diese Zeilen Code hinzufügen könnte:

var regex = @"(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)" 
var match = Regex.Match(inputYouWantToCheck, regex,RegexOptions.IgnoreCase); 

    if (!match.Success) 
    { 
     // Color is not valid 
    } 

Hoffnung, das hilft.

+0

Ich weiß das und danke für deine Antwort, aber das ist nicht genau das, wonach ich frage. Wie wäre es möglich, falls der Farbwert nicht übereinstimmt, den aktuellen Hexwert auszugeben? anstatt zu versuchen, es mit einem falschen zu ändern. – lecloneur

0

ich es anders machen würde, das Eigentum mit der Farbe bestätigen:

public Color Color { get; set; } = Colors.Red; 

public string ColorText 
{ 
    get { return (new ColorConverter()).ConvertToString(Color); } 
    set 
    { 
     Color = (Color)ColorConverter.ConvertFromString(value); 
     OnPropertyChanged(); 
    } 
} 

Binden an ColorText, im Falle zu werfen, es ist falsch hex, und Sie können ExceptionValidationRule verwenden, um sie anzuzeigen (als rot Grenze):

<TextBox Text="{local:ExceptionBinding Path=ColorText}" /> 

wo

public class ExceptionBinding : Binding 
{ 
    public ExceptionBinding() : base() 
    { 
     ValidationRules.Add(new ExceptionValidationRule()); 
    } 
} 

Als bonu s können Sie bekannte Farben als Text eingeben, z. "Red":

+0

Ich versuche das aber OnPropertyChanged() brauche ein Argument nein? – lecloneur

+0

Ja (Argument erforderlich) und Nein (optional). Sie können 'CallerMemberNameAttribute' verwenden, um den Methodennamen automatisch zur Kompilierzeit anzugeben (Property-Setter ist eine Methode), siehe 'OnPropertyChanged' in [diese Antwort] (http://stackoverflow.com/a/18485965/1997232). – Sinatr

0

Was ist, wenn Sie etwas haben, wo Sie ein Label neben dem Textfeld hinzufügen, das ein Beispiel zu zeigen, welche Farbe eingegeben wurde. Sie müssten nur die Änderung der Etikettenfarbe jedes Mal ändern.

Verwandte Themen