Проверка цвета в серебряном свете - PullRequest
3 голосов
/ 27 декабря 2010

Я создаю некоторый xaml в классе шаблона, и мне нужен прямоугольник, чтобы свойство Fill было установлено на что-то из текстового поля, заполненного конечным пользователем.Поэтому мне нужно проверить, что значение можно преобразовать в объект Brush перед выводом xaml.В противном случае, если значение не является допустимым цветом (именованным или нет), я получаю следующее: Ошибка: Sys.InvalidOperationException: Неверный XAML для элемента управления 'sldivparent'.[] (строка 6, столбец 412): не удалось создать «System.Windows.Media.Brush» из текста «NotValidColorValue».Очевидно, что я не хочу этого, и в случае недопустимого значения я просто хочу, чтобы оно было Белым.

Итак, как я могу убедиться, что NotValidColorValue 'является допустимым значением цвета, прежде чем продолжить?

Спасибо

Редактировать для дальнейшего уточнения: я использую палитру цветов, для точного вызова палитры цветов YUI из Silverlight, и она работает нормально.Дело в том, что пользователь может также ввести цвет (или # 112233 или «красный») непосредственно в текстовое поле, и это должно быть допустимым или отображать белый, если он недействителен.Я не хочу вдаваться в подробности ручной проверки имен цветов, поэтому в идеале я хотел бы попытаться создать объект какого-либо типа (может быть, некоторой производной кисти) с использованием того, что набрал пользователь, и если это не удастсяЯ бы знал, что значение цвета было недействительным и действовал бы соответственно.

Ответы [ 3 ]

3 голосов
/ 05 января 2011

Обновление
Еще немного подумал над этой проблемой. Вы можете просто привязать значение :) Это позволит как проверить цвет, так и установить его. Недопустимое значение будет использовать FallbackValue White.

<Rectangle Fill="{Binding ElementName=textBox,
                          Path=Text,
                          FallbackValue=White}"/>
<TextBox Name="textBox" Text="Green"/>

И если вам нужно иметь такие методы, как IsColorValid и GetColorFromValue в коде позади, вы можете использовать привязки там, например,

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 голос
/ 04 января 2011

Не уверен, что вы хотите, но если вы хотите проверить значения #11223344, используйте Regex validation, используя что-то вроде следующего шаблона:

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

Теперь, если вы хотите, чтобы пользователь вводил название цвета, попробуйте использовать что-то вроде Color ComboBox.

И, наконец, я бы порекомендовал использовать ColorPicker превыше всего. Речь идет о предоставлении Rich UI в конце концов.

0 голосов
/ 05 января 2011

Вы можете попробовать создать объект Brush с тем, что вводит пользователь. Если оно выдает исключение, поймайте его и сообщите об этом пользователю. В противном случае это действительный Color.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...