2010-12-27 11 views
3

Ich konstruiere einige XAML in einer Template-Klasse und ich brauche ein Rechteck, um eine Fill-Eigenschaft auf etwas aus einem Textfeld vom Endbenutzer gefüllt zu haben. Daher muss überprüft werden, dass der Wert vor der Ausgabe von xaml in ein Brush-Objekt konvertiert werden kann. Andernfalls, wenn der Wert keine gültige Farbe ist (benannt oder nicht), erhalte ich folgende Fehlermeldung: Fehler: Sys.InvalidOperationException: Ungültiges XAML für Steuerelement 'sldivparent'. [] (Zeile 6, Spalte 412): Fehler beim Erstellen einer 'System.Windows.Media.Brush' aus dem Text 'NotValidColorValue'. Offensichtlich will ich das nicht und im Falle eines ungültigen Wertes möchte ich nur, dass es Weiß ist.Validierung einer Farbe in Silverlight

Wie kann ich sicherstellen, dass "NotValidColorValue" ein gültiger Farbwert ist, bevor Sie fortfahren?

Dank

Bearbeiten zur weiteren Klärung: I Farbauswahl verwenden, eine YUI Farbauswahl von Silverlight-Aufruf genauer und sein Arbeits in Ordnung zu sein. Die Sache ist, dass ein Benutzer auch eine Farbe (entweder # 112233 oder "Rot") direkt in das Textfeld eingeben kann, die gültig sein muss, oder weiß anzeigen, wenn sie ungültig ist. Ich möchte nicht in die gesamte manuelle Überprüfung von Farbnamen gehen, also idealerweise möchte ich versuchen, ein Objekt von einem beliebigen Typ (vielleicht ein Pinsel-Derivat) zu erstellen mit dem, was Benutzer eingegeben hat und wenn dies nicht tut Erfolg Ich würde wissen, dass der Farbwert ungültig war und entsprechend handeln.

Antwort

3

Aktualisieren
Haben einige mehr über dieses Problem nachgedacht. Sie können nur den Wert binden :) Dies wird sowohl die Farbe validieren und setzen. Ein ungültiger Wert verwendet den FallbackValue White.

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

Und wenn Sie Methoden wie IsColorValid und GetColorFromValue in Code haben, müssen hinter Ihnen Bindungen auch dort ähnliche

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 große Antwort !! – Stan

+0

das, Sir, ist das, was ich "Spot" nenne! ganz und gar verdiente Punkte auf deinem Weg. – danijels

+0

@danijels: Danke :) Sogar scrgb Text-Werte wie '" sC# 1.0.0.5,0.8,0.0 "' arbeitet mit diesem Ansatz.Der alte Teil meiner Antwort wurde entfernt –

1

nicht sicher, was Sie wollen, aber wenn Sie #11223344 Werte überprüfen möchten, verwenden Sie Regex validation so etwas wie folgendes Muster verwenden:

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

Nun, wenn Sie einen Benutzer wollen versuchen, einen Namen der Farbe geben nach unten, mit etwas wie Color ComboBox stattdessen.

Und schließlich würde ich vor allem eine ColorPicker empfehlen. Es geht um eine Rich UI immerhin.

+1

Benutzer verwenden können, muss in der Lage sein, sowohl benannte Farbe zu geben oder # 11223344 . Und ich benutze einen Colorpicker, nur nicht den Silverlight. – danijels

+1

Also, hast du den 'regex' Vorschlag versucht? Sie können auch alle öffentlichen statischen Eigenschaften vom Typ "Color" aus der Klasse "Colors" mit "Reflection" auflisten und Namen in einer Liste speichern. Verwenden Sie den obigen Regex, um ihn mit # pattern zu vergleichen und ihn mit der Farbnamenliste abzugleichen. – decyclone

0

Sie könnten versuchen, das Brush Objekt mit dem, was der Benutzer eingibt, zu erstellen. Wenn es eine Ausnahme auslöst, fangen Sie es ab und informieren Sie den Benutzer. Ansonsten ist es eine gültige Color.

+0

Pinsel ist eine abstrakte Klasse und kann nicht erstellt werden. SolidColorBrush als eine der abgeleiteten Klassen hat keinen Konstruktor, der eine Zeichenkette aufnehmen und damit versuchen kann, sie in eine Farbe zu verwandeln. – danijels

+0

Was wirft die Ausnahme? Warum kannst du das nicht versuchen? –

Verwandte Themen