Durante la navigazione nella documentazione MSDN, potresti incontrare questo gioiello: TextBox.Watermark.Come utilizzare TextBox.Watermark in Silverlight 4?
"Incredibile! Ho voluto un modo integrato per eseguire watermarking sulle mie caselle di testo! È fantastico, lasciami andare e impostalo in XAML!"
<TextBox Watermark="This is my watermark" Margin="20"></TextBox>
Purtroppo, se si esegue questo non sarà possibile ottenere quello che vi aspettate:
E dettaglio:
Che cosa è questo? Bene, guarda la documentazione MSDN da vicino:
Proprio così. È supportato in Silverlight 4, ma dice anche "Non utilizzare in un'applicazione Silverlight 4". Se lo si utilizza, si riceve un'eccezione System.NotImplemented. Per verificare, ecco il codice per la proprietà decompilato via Riflettore:
[EditorBrowsable(EditorBrowsableState.Never)]
public object Watermark
{
get
{
StubHelper.ThrowIfNotInDesignMode();
return base.GetValue(WatermarkProperty);
}
set
{
StubHelper.ThrowIfNotInDesignMode();
base.SetValue(WatermarkProperty, value);
}
}
V'è - viene generata un'eccezione in qualsiasi momento non è nella modalità di progettazione. Questo non ha senso, giusto? Perché Microsoft dovrebbe fare questo?
Purtroppo non ho ancora trovato alcuna risposta definitiva, tuttavia se dovessi indovinare è perché Microsoft sta pianificando di implementare un comportamento Watermark sul controllo TextBox in una versione futura (forse v5) e volevo riservare efficacemente questa proprietà quindi i creatori di controlli di terze parti non sottoclassi TextBox e creano la loro proprietà Watermark. Conosco almeno un fornitore di controlli, ComponentOne, che ha un controllo che eredita da TextBox e fornisce una proprietà Watermark. Per me, sembra che questo sia il modo in cui Microsoft scoraggia le persone dall'usare questo nome di proprietà nelle loro sottoclassi TextBox.
+1 per molto bella soluzione . A proposito, funziona bene con Silverlight 5. È interessante notare che la documentazione di SL5 MSDN ha ancora le stesse informazioni in conflitto sulla proprietà Watermark. –
Nota anche che ho ottimizzato leggermente il codice, principalmente per risolvere l'errore in fase di progettazione se la proprietà Watermark non è impostata. Codice aggiornato aggiunto come nuova risposta di seguito. –
Ti sei registrato agli eventi nel costruttore, ma nello scaricamento non sei registrato da loro (che va bene), ma questo porta a problemi con il controllo struttura a schede, il controllo Tab scaricherà il suo contenuto e verrà caricato quando viene premuta la scheda appropriata, quindi forse dovresti registrati agli eventi in evento Loaded invece di constructor. – Sonosar