我创建了一个文本框来输入并显示颜色十六进制值。绑定是双向的父颜色属性。
一切正常但是,我需要确保,如果我在文本框中手动输入十六进制,如果这是一个不正确的字符串,那么使用并显示颜色的当前十六进制值,而不是尝试改变它。
这是我尝试的但很明显它没有用,我是初学者,我对转换器和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}}}" />
有什么想法吗?
谢谢
答案 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)
如果您在文本框旁边添加标签,以显示输入的颜色示例,该怎么办?您只需要每次都更改标签颜色更改。