我在模板类中构造了一些xaml,我需要一个矩形来将Fill属性设置为来自最终用户填充的文本框的内容。因此,我需要在输出xaml之前验证该值是否可转换为Brush对象。否则,如果值不是有效颜色(命名与否),我会得到以下信息:错误:Sys.InvalidOperationException:控件'sldivaparent'的XAML无效。 [](第6行,第412栏):无法从文本'NotValidColorValue'创建'System.Windows.Media.Brush'。显然,我不希望这样,如果价值无效,我只想让它成为白色。
那么在继续之前我怎样才能确保'NotValidColorValue'是有效的颜色值?
由于
编辑以进一步说明: 我正在使用颜色选择器,从silverlight调用YUI颜色选择器是准确的,它的工作正常。问题是用户还可以直接在文本框中键入颜色(#112233或“红色”),并且需要有效或如果无效则显示白色。我不想要 进入整个手动检查颜色名称,所以理想情况下我想尝试使用输入的任何用户创建某种类型的对象(可能是一些Brush衍生物),如果不成功,我会知道颜色值无效并采取相应行动。
答案 0 :(得分:3)
<强>更新强>
做了一些更多的思考这个问题。你可以绑定值:)这将验证颜色并设置它。无效值将使用FallbackValue White。
<Rectangle Fill="{Binding ElementName=textBox,
Path=Text,
FallbackValue=White}"/>
<TextBox Name="textBox" Text="Green"/>
如果您需要在代码中使用IsColorValid和GetColorFromValue等方法,那么您可以在那里使用Bindings
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;
}
答案 1 :(得分:1)
不确定您想要什么,但如果您想验证#11223344
值,请使用以下格式之类的内容使用Regex validation
:
(^#[0-9A-Fa-f]{8}$|^#[0-9A-Fa-f]{6}$|^#[0-9A-Fa-f]{3}$)
现在,如果您希望用户输入颜色名称,请尝试使用Color ComboBox
之类的内容。
最后,我建议首先使用ColorPicker
。它毕竟是提供Rich UI
。
答案 2 :(得分:0)
您可以尝试使用用户输入的内容创建Brush
对象。如果它抛出异常,请抓住它并让用户知道。否则,它是有效的Color
。