2010-12-27 38 views
3

テンプレートクラスにいくつかのxamlを構築し、Fillプロパティをエンドユーザが入力したテキストボックスからのものに設定するための四角形が必要です。したがって、xamlを出力する前に、その値がBrushオブジェクトに変換可能であることを検証する必要があります。それ以外の場合、値が有効な色(名前付きであるかどうか)でない場合は、次のようになります。エラー:Sys.InvalidOperationException:コントロール 'sldivparent'のXAMLが無効です。 [](行6、列412):テキスト 'NotValidColorValue'から 'System.Windows.Media.Brush'の作成に失敗しました。明らかに、私はそれを望んでいないし、無効な値の場合には私はそれを白にしたい。Silverlightでの色の妥当性確認

それでは、「NotValidColorValue」が有効なカラー値であることを確認するにはどうすればいいですか?

おかげでさらに明確にするため

編集: 私は正確とその作業罰金するのSilverlightからYUIカラーピッカーを呼び出して、カラーピッカーを使用しています。ユーザーがテキストボックスに色(#112233または "Red"のいずれか)を直接入力することができ、無効であれば有効である必要があります。私は に色の名前の全体的な手動チェックに入ることを望まないので、理想的には、ユーザーが入力したものを使用して何らかのタイプのオブジェクト(多分いくつかのブラシの派生物)を作成しようとしたいと思います。私は色の値が無効であり、それに応じて行動することを知っています。

答えて

3

更新
さらにこの問題について考えましたか?値をバインドするだけです:)これは色を検証して設定します。無効な値はFallbackValue Whiteを使用します。

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

そして、あなたはあなたがこの

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; 
} 
+0

+1すてきな答え! – Stan

+0

、それは私がスポットと呼ぶものです!あなたの道に来て本当に価値のあるポイントです。 – danijels

+0

@danijels:ありがとうございます。「sc#1.0,0.5,0.8,0.0」のようなscrgbのテキスト値でさえ、このアプローチで動作します。私の答えの古い部分を削除 –

1

したいが、あなたは#11223344値を検証したい場合は、以下のパターンのようなものを使用してRegex validationを使用するかわからない:使用して、あなたは色の名前を下に入力するようにユーザーをしたい場合は、

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

今すぐ試します代わりにColor ComboBoxのようなものです

最後に、ColorPickerを使用することをおすすめします。結局のところ、Rich UIを提供しています。

+1

ユーザーのようにそこにもバインディングを使用することができます後ろにコードでIsColorValidとGetColorFromValueのようなメソッドを持っている必要がある場合は、両方の名前の色や#11223344を入力できるようにしています。そして私は、銀色のものだけではなく、カラーピッカーを使用しています。 – danijels

+1

だから、 'regex'の提案を試しましたか? 'Reflection'を使って' Color'クラスから 'Color'タイプのすべてのパブリック静的プロパティをリストし、名前をリストに格納することもできます。上記の正規表現を#パターンとマッチさせ、カラー名リストとマッチさせてください。 – decyclone

0

Brushオブジェクトは、ユーザーが入力した内容で作成できます。例外がスローされた場合は、それをキャッチしてユーザーに知らせます。それ以外の場合は、有効なColorです。

+0

ブラシは抽象クラスであり、作成できません。派生クラスの1つであるSolidColorBrushには、文字列を受け取り、それを色に変換しようとするコンストラクタがありません。 – danijels

+0

例外を投げているのは何ですか?どうしてあなたはそれを捕まえることができないのですか? –