在silverlight中验证颜色
我在模板类中构造了一些xaml,我需要一个矩形来将Fill属性设置为来自最终用户填充的文本框的内容。因此,在输出xaml之前,我需要验证该值是否可转换为笔刷对象。否则,如果该值不是有效的颜色(命名或非命名),我将得到以下结果:错误:Sys.invalidoOperationException:控件“sldivparent”的XAML无效。[](第6行,第412列):未能从文本“NotValidColorValue”创建“System.Windows.Media.Brush”。很明显,我不想这样,如果值无效,我只希望它是白色的 那么,在继续之前,如何确保“NotValidColorValue”是有效的颜色值 谢谢 编辑以进一步澄清: 我正在使用颜色选择器,从silverlight调用YUI颜色选择器,准确地说,它工作良好。问题是,用户还可以直接在文本框中键入颜色(红色或#112233),该颜色必须有效,如果无效,则显示白色。我不想要在silverlight中验证颜色,silverlight,validation,colors,Silverlight,Validation,Colors,我在模板类中构造了一些xaml,我需要一个矩形来将Fill属性设置为来自最终用户填充的文本框的内容。因此,在输出xaml之前,我需要验证该值是否可转换为笔刷对象。否则,如果该值不是有效的颜色(命名或非命名),我将得到以下结果:错误:Sys.invalidoOperationException:控件“sldivparent”的XAML无效。[](第6行,第412列):未能从文本“NotValidColorValue”创建“System.Windows.Media.Brush”。很明显,我不想这样,
进入颜色名称的整个手动检查,因此理想情况下,我想尝试使用用户键入的任何内容创建某种类型的对象(可能是一些笔刷衍生工具),如果不成功,我会知道颜色值无效,并相应地采取行动。不确定您想要什么,但如果要验证
\11223344
值,使用Regex验证
使用如下模式:
(^#[0-9A-Fa-f]{8}$|^#[0-9A-Fa-f]{6}$|^#[0-9A-Fa-f]{3}$)
现在,如果您希望用户键入颜色名称,请尝试使用类似的方法
最后,我建议首先使用。毕竟,它是关于提供一个
丰富的UI
。您可以尝试用用户输入的任何内容创建笔刷
对象。如果它抛出异常,捕获它并让用户知道。否则,它是有效的颜色
更新对这个问题做了更多的思考。您可以只绑定值:)这将验证颜色并进行设置。无效值将使用FallbackValue白色
<Rectangle Fill="{Binding ElementName=textBox,
Path=Text,
FallbackValue=White}"/>
<TextBox Name="textBox" Text="Green"/>
用户必须能够同时输入命名颜色或#11223344。我使用的是一个颜色选择器,而不是silverlight。那么,您是否尝试了
regex
建议?您还可以使用Reflection
从Colors
类中列出Color
类型的所有公共静态属性,并将名称存储在列表中。使用上面的正则表达式将其与#模式匹配,并与颜色名称列表匹配。Brush是一个抽象类,无法创建。作为派生类之一的SolidColorBrush没有可以获取字符串并使用它尝试将其转换为颜色的构造函数。引发异常的是什么?你为什么不试试看呢?先生,这就是我所说的当场!这是你应得的分数。@danijels:谢谢:)即使是scrgb文本值,如“sc#1.0,0.5,0.8,0.0”
也适用于这种方法。删除了我答案中的旧部分
private bool IsValidColor(string colorValue)
{
if (colorValue == "White" || colorValue == "#FFF" || colorValue == "#FFFF" ||
colorValue == "#FFFFFF" || colorValue == "#FFFFFFFF")
{
return true;
}
Brush fallbackBrush = new SolidColorBrush(Colors.White);
Rectangle validationRectangle = new Rectangle();
Binding validationBinding = new Binding();
validationBinding.Source = colorValue;
validationBinding.FallbackValue = fallbackBrush;
validationRectangle.SetBinding(Rectangle.FillProperty, validationBinding);
if (validationRectangle.Fill == fallbackBrush)
{
return false;
}
return true;
}
private Color GetColorFromValue(string colorValue)
{
Rectangle validationRectangle = new Rectangle();
Binding validationBinding = new Binding();
validationBinding.Source = colorValue;
validationBinding.FallbackValue = new SolidColorBrush(Colors.White);
validationRectangle.SetBinding(Rectangle.FillProperty, validationBinding);
return ((SolidColorBrush)validationRectangle.Fill).Color;
}