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
Bitte zeigen Sie auch Ihre XAML. – toadflakz
Bitte definieren Sie "nicht funktioniert". Was läuft falsch und wo? – ChrisF
ok Ich habe mehr Infos hinzugefügt – lecloneur