2009-08-20 8 views
27

Sono un principiante al WPF.WPF: ripristino del pennello predefinito/originale

Al momento eseguo un controllo utente per gli elementi del modulo denominato "LabeledTextbox" che contiene un'etichetta, una casella di testo e un blocco di testo per i messaggi errati.

Quando il codice utilizzando aggiunge un messaggio errato, desidero mettere il bordo della casella di testo in rosso. Ma, quando viene rimosso il messaggio errato, mi piacerebbe tornare al bordercolor predefinito della casella di testo. Penso che ci debba essere un modo molto semplice per farlo.

Il mio codice:

(in pubblico classe LabeledTextbox parziale: UserControl)

public string ErrorMessage 
{ 
    set 
    { 
     if (string.IsNullOrEmpty(value)) 
     { 
      _textbox.BorderBrush = Brushes.Black; //How do I revert to the original color in the most elegant way? 
     } 
     else 
     { 
      _textbox.BorderBrush = Brushes.Red; 
     } 

     _errorMessage.Text = value; 
    } 
} 

risposta

43

si potrebbe usare

_textBox.ClearValue(TextBox.BorderBrushProperty); 

che rimuoverà il valore assegnato direttamente e tornare a il valore definito dallo stile o modello.

+1

ottimo, grazie! * aggiunge la ricerca di dipendencyproperty all'elenco di cose da fare * –

+0

Grazie, articolo molto utile. Ho provato a memorizzare il pennello predefinito con il metodo brush.clone, ma secondo .net nessun pennello esiste quando il suo sistema è predefinito. Grazie! – JustinKaz

+2

Questo non ha funzionato per me. Faccio da sfondo ad Acquamarina quando voglio attirare l'attenzione su di esso. Ho provato a usare ClearValue per ripristinarlo ma è rimasto come Aquamarine. Guardando questo post: (http://wpf.2000things.com/tag/clearvalue/) mi è stato detto che ClearValue lo riporta all'ultimo valore assegnato. Così ho provato a impostare la proprietà Background su Nothing e ha funzionato. Lo sfondo dell'etichetta era ora il colore predefinito. – tolsen64

0

Funziona? Impostarlo su nero è meglio che utilizzare il metodo ClearValue

public string ErrorMessage 
{ 
    set 
    { 
     if (string.IsNullOrEmpty(value)) 
     { 
      _textbox.Background = Brushes.Black; 
     } 
     else 
     { 
      _textbox.Background = Brushes.Red; 
     } 

     _errorMessage.Text = value; 
    } 
} 
+0

oh scusa, ho fatto un errore nel mio post. Non perché il valore predefinito è un colore sfumato. –

+0

@ Stock Thomas: 0 mai testato. Quindi scusa anche. –

0

Basta memorizzare le impostazioni predefinite. Ecco un esempio di codice.

 System.Windows.Media.Brush save; 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
       { 
      //Store the default background 
     save = testButton.Background; 

     } 


     private void ChangeBackground(){ 

     testButton.Background = Brushes.Red; 

     } 

     private void restoreDefaultBackground(){ 

     //Restore default Backgroundcolor 

     testButton.Background = save; 

     } 
9

È possibile afferrare i colori di default dalla classe SystemColors

Ecco l'elenco dei tutti i colori di sistema: http://msdn.microsoft.com/de-de/library/system.windows.systemcolors.aspx

predefinito colore sfondo dell'area client:

 _textbox.Background = SystemColors.WindowBrush; 

default testo di colore dentro l'area client:

 _textbox.SystemColors.WindowTextBrush 
+1

Questa risposta è utile nell'ambiente MVVM. Non riesco a cancellare la proprietà BorderBrush come nella risposta altrimenti buona di Daniel. Ma impostando lo sfondo di un controllo sul suo pennello di default funziona restituendo esplicitamente il pennello in una proprietà sul viewmodel. – Julian

3

I può essere in ritardo alla festa, ma per i futuri lettori, è anche possibile utilizzare Button.BackgroundProperty.DefaultMetadata.DefaultValue per questo scopo. Ciò è particolarmente utile quando si utilizza un convertitore in cui è necessario restituire un valore e pertanto non è possibile utilizzare la chiamata ClearValue().