Beim Durchsuchen der MSDN-Dokumentation stoßen Sie möglicherweise auf dieses Juwel: TextBox.Watermark.Wie verwende ich TextBox.Watermark in Silverlight 4?
"Super! Ich wollte eine integrierte Möglichkeit, Wasserzeichen auf meinen Textfeldern zu erstellen! Das ist großartig, lass mich weitermachen und setze das in XAML!"
<TextBox Watermark="This is my watermark" Margin="20"></TextBox>
Leider, wenn Sie diese ausführen werden Sie nicht bekommen, was Sie erwarten:
Und das Detail:
Was ist das? Nun, schauen Sie sich die MSDN-Dokumentation genau an:
Das stimmt. Es wird in Silverlight 4 unterstützt, aber es sagt auch "Verwenden Sie nicht in einer Silverlight 4-Anwendung". Wenn Sie es verwenden, erhalten Sie eine System.NotImplemented-Ausnahme. Um zu überprüfen, hier ist der Code für die Eigenschaft über Reflector dekompilierten:
[EditorBrowsable(EditorBrowsableState.Never)]
public object Watermark
{
get
{
StubHelper.ThrowIfNotInDesignMode();
return base.GetValue(WatermarkProperty);
}
set
{
StubHelper.ThrowIfNotInDesignMode();
base.SetValue(WatermarkProperty, value);
}
}
Es ist - es löst eine Ausnahme zu jeder Zeit es nicht im Entwurfsmodus ist. Das ergibt keinen Sinn oder? Warum würde Microsoft das tun?
Leider habe ich noch keine definitive Antwort gefunden, aber wenn ich raten musste, ist es, weil Microsoft plant, ein Watermark-Verhalten für das TextBox-Steuerelement in einer zukünftigen Version (vielleicht v5) zu implementieren und diese Eigenschaft effektiv reservieren wollte Daher erstellen Drittanbieter-Steuerelementersteller keine Unterklasse von TextBox und erstellen ihre eigene Watermark-Eigenschaft. Ich kenne mindestens einen Steuerelementanbieter, ComponentOne, der über ein Steuerelement verfügt, das von TextBox erbt und eine Watermark-Eigenschaft bereitstellt. Mir scheint, das ist Microsofts Weg, Menschen davon abzuhalten, diesen Eigenschaftsnamen für ihre eigenen TextBox-Unterklassen zu verwenden.
+1 für sehr schöne Lösung . Funktioniert übrigens in Silverlight 5 gut. Interessant zu beachten, dass SL5 MSDN-Dokumentation immer noch die gleichen widersprüchlichen Informationen über die Watermark-Eigenschaft enthält. –
Beachten Sie auch, dass ich den Code etwas optimiert habe, hauptsächlich um Design-Time-Fehler zu beheben, wenn die Watermark-Eigenschaft nicht gesetzt ist. Aktualisierter Code, der unten als neue Antwort hinzugefügt wurde. –
Sie haben sich bei Ereignissen im Konstruktor registriert, aber beim Entladen sind Sie nicht registriert (was in Ordnung ist), aber dies führt zu Problemen mit der Tab-Steuerung, Tab Control wird den Inhalt entladen und geladen, wenn die entsprechende Registerkarte gedrückt wird Register zu Ereignissen in Loaded-Ereignis statt Konstruktor. – Sonosar