检查Converter中的十六进制字符串是否正确

时间:2016-08-10 13:58:48

标签: c# wpf

我创建了一个文本框来输入并显示颜色十六进制值。绑定是双向的父颜色属性。

一切正常但是,我需要确保,如果我在文本框中手动输入十六进制,如果这是一个不正确的字符串,那么使用并显示颜色的当前十六进制值,而不是尝试改变它。

这是我尝试的但很明显它没有用,我是初学者,我对转换器和WPF只有一点经验。如果我写的不是有效的十六进制字符串,那么当文本框得到一个红色轮廓时,但我希望在这种情况下,再次出现十六进制的前一个字符串。

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

TextBox的C#类

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

它在Generic.xaml中的xaml

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

有什么想法吗?

谢谢

2 个答案:

答案 0 :(得分:0)

有效的十六进制颜色的格式为“#nnn”或'#nnnnnn' 因此,此案例的regex将为:(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$) 不,您可以添加以下代码行:

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
    }

希望这有帮助。

答案 1 :(得分:0)

如果您在文本框旁边添加标签,以显示输入的颜色示例,该怎么办?您只需要每次都更改标签颜色更改。