【问题标题】:Validating a color in silverlight在 silverlight 中验证颜色
【发布时间】:2010-12-27 14:46:52
【问题描述】:

我在模板类中构造了一些 xaml,我需要一个矩形来将 Fill 属性设置为来自最终用户填充的文本框的内容。因此,我需要在输出 xaml 之前验证该值是否可转换为 Brush 对象。否则,如果该值不是有效的颜色(已命名或未命名),我会得到以下信息:错误:Sys.InvalidOperationException:控件“sldivparent”的无效 XAML。 [](第 6 行,第 412 列):无法从文本“NotValidColorValue”创建“System.Windows.Media.Brush”。显然,我不希望这样,如果值无效,我只希望它是白色的。

那么在继续之前如何确保“NotValidColorValue”是一个有效的颜色值?

谢谢

编辑以进一步澄清: 我正在使用颜色选择器,准确地说是从 silverlight 调用 YUI 颜色选择器,并且工作正常。问题是用户还可以直接在文本框中输入颜色(#112233 或“红色”),并且该颜色需要有效,如果无效则显示为白色。我不想 进入颜色名称的整个手动检查,所以理想情况下,我想尝试使用用户输入的任何内容创建某种类型的对象(可能是一些 Brush 衍生物),如果不成功,我会知道颜色值无效并采取相应措施。

【问题讨论】:

    标签: silverlight validation colors


    【解决方案1】:

    更新
    对这个问题做了更多的思考。您可以绑定值:) 这将验证颜色并设置它。无效值将使用 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;
    }
    

    【讨论】:

    • 先生,这就是我所说的正确!真正应得的积分即将到来。
    • @danijels:谢谢 :) 即使像 "sc# 1.0,0.5,0.8,0.0" 这样的 scrgb 文本值也可以使用这种方法。删除了我答案的旧部分
    【解决方案2】:

    不确定您想要什么,但如果您想验证 #11223344 值,请使用 Regex validation 使用类似以下模式的内容:

    (^#[0-9A-Fa-f]{8}$|^#[0-9A-Fa-f]{6}$|^#[0-9A-Fa-f]{3}$)
    

    现在,如果您希望用户输入颜色名称,请尝试改用 Color ComboBox 之类的名称。

    最后,我建议首先使用ColorPicker。毕竟是关于提供Rich UI

    【讨论】:

    • 用户必须能够输入命名颜色或#11223344。而且我正在使用颜色选择器,但不是silverlight。
    • 那么,您是否尝试过regex 的建议?您还可以使用Reflection 列出Colors 类中Color 类型的所有公共静态属性,并将名称存储在列表中。使用上面的正则表达式将其与 # 模式匹配,并将其与颜色名称列表匹配。
    【解决方案3】:

    您可以尝试使用用户输入的任何内容创建Brush 对象。如果它抛出异常,捕获它并让用户知道。否则,它是一个有效的Color

    【讨论】:

    • Brush 是抽象类,无法创建。 SolidColorBrush 作为派生类之一,没有构造函数可以接受字符串并使用它来尝试将其转换为颜色。
    • 什么是抛出异常?为什么你不能尝试/抓住它?
    猜你喜欢
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多