2011-11-09 4 views
0

Après avoir essayé de nombreuses méthodes pour obtenir watermarking travailler pour moi, j'ai finalement trouvé celui modifié par @Beej sur cette page: Watermark/hint text/placeholder TextBox in WPFClearAll avec filigrane sur textbox dans WPF

Je l'ai placé dans mon projet, et ça marche bien, à une exception près. J'ai plusieurs zones de texte sur chaque onglet d'un tabcontrol. En bas se trouve un bouton qui efface toutes les zones de texte de l'onglet. Le bouton d'effacement fonctionne bien, le filigrane fonctionne bien, mais je n'arrive pas à les faire fonctionner ensemble. La fenêtre se charge avec les filigranes en place, et appuyer sur le bouton effacer efface toutes les cases, mais les filigranes ne réapparaissent qu'après que je me déplace dans les zones de texte (chacun gagnant et perdant le focus). , comme placer un appel de méthode à la fonction ShowWatermark dans l'événement ButtonUp Mouse, mais rien n'a fonctionné ... Aide ?!

Ceci est la méthode de bouton Clear J'utilise:

public void ClearTextBoxes() 
    { 
     ChildControls ccChildren = new ChildControls(); 

     foreach (object o in ccChildren.GetChildren(rvraDockPanel, 2)) 
     { 
      if (o.GetType() == typeof(TextBox)) 
      { 
       TextBox txt = (TextBox)o; 
       txt.Text = ""; 
      } 

      if (o.GetType() == typeof(DigitBox)) 
      { 
       DigitBox digit = (DigitBox)o; 
       digit.Text = ""; 
      } 

      if (o.GetType() == typeof(PhoneBox)) 
      { 
       PhoneBox phone = (PhoneBox)o; 
       phone.Text = ""; 
      } 

      if (o.GetType() == typeof(DateBox)) 
      { 
       DateBox date = (DateBox)o; 
       date.Text = ""; 
      } 

      if (o.GetType() == typeof(TextBoxWatermarked)) 
      { 
       TextBoxWatermarked water = (TextBoxWatermarked)o; 
       water.Text = ""; 

      } 
     } 
    } 

class ChildControls 
{ 
    private List<object> listChildren; 

    public List<object> GetChildren(Visual p_vParent, int p_nLevel) 
    { 
     if (p_vParent == null) 
     { 
      throw new ArgumentNullException("Element {0} is null!", p_vParent.ToString()); 
     } 

     this.listChildren = new List<object>(); 

     this.GetChildControls(p_vParent, p_nLevel); 

     return this.listChildren; 

    } 

    private void GetChildControls(Visual p_vParent, int p_nLevel) 
    { 
     int nChildCount = VisualTreeHelper.GetChildrenCount(p_vParent); 

     for (int i = 0; i <= nChildCount - 1; i++) 
     { 
      Visual v = (Visual)VisualTreeHelper.GetChild(p_vParent, i); 

      listChildren.Add((object)v); 

      if (VisualTreeHelper.GetChildrenCount(v) > 0) 
      { 
       GetChildControls(v, p_nLevel + 1); 
      } 
     } 
    } 
} 

Tant la classe ChildControls et la classe TextboxWatermarked (à partir du lien ci-dessus) sont dans des fichiers de classe séparés.

Répondre

1

Le problème ne réside pas dans votre code, mais dans la zone de texte en filigrane choisie. Il ne met à jour le filigrane que lorsqu'il gagne ou perd son focus, ce qui est un défaut évident. Vous devrez trouver une meilleure implémentation. Avez-vous essayé celui en extended WPF toolkit?

+0

Merci, a parfaitement fonctionné! –