2012-03-26 13 views
3

Ich habe UserControl in WPF 4.0, die Schaltflächen, Beschriftungen, Textfelder usw. enthält. Ich möchte diese Steuerelemente Schleife und wenn ich ein buton, möchte ich seinen Namen nehmen und speichern Sie es auf meiner Liste. Im Grunde möchte ich nur eine Names_list aller meiner Buttons im UserControl erstellen.Kann Kontrollen in User Control im VisualTreeHelper

Ich habe eine Methode, die alle Kontrollen durchläuft und wenn es einen Knopf findet, speichert seinen Namen -

public void EnumVisual(Visual myVisual) 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(myVisual); i++) 
     { 
      // Retrieve child visual at specified index value. 
      Visual childVisual = (Visual)VisualTreeHelper.GetChild(myVisual, i); 

      Button _button = childVisual as Button; 
      if (_button != null) 
      { 
       Class_Button _newButtonClass = new Class_Button(); 
       if (_button.Name != null) 
       { 
        _newButtonClass.ButtonName = _button.Name; 
       } 
       ButtonsList.Add(_newButtonClass); 
      } 

      // Enumerate children of the child visual object. 
      EnumVisual(childVisual); 

     } 
    } 

ich eine leere Liste immer bekommen. Wenn ich den Code einfüge, indem ich ihn debugge und den VisualTree meines UserControls beobachte, sehe ich alle Panels und GroupBoxes und Grids, aber ich sehe keine Buttons, Labels und Texboxen, obwohl jedes Steuerelement ax: Name und jedes Control ist x : FieldModifier = "öffentlich". Das ist sehr merkwürdig .... Und ich verstehe nicht den Grund dafür und wie ich dieses Problem lösen kann ... kann mir jemand sagen, was ich falsch mache? Dank

+1

Wann rufen Sie EnumVisual()? Sind Sie sicher, dass die Vorlage zu diesem Zeitpunkt angewendet wurde? – GazTheDestroyer

+0

@GazTheDestroyer Ich erstelle mein MainWindow, welches das UserControl enthält und nachdem es angezeigt wird, rufe ich die Funktion auf, die die Buttonliste durch einen Klick auf ein MenuItem bekommt ..... und an diesem Punkt kann ich das UserControl in meinem MainWindow sehen ... –

+0

Das bedeutet nicht, dass das UserControl bereits geladen ist. Es befindet sich möglicherweise in der Mitte des Prozesses an dem Punkt, an dem Ihr Code diese Methode eingibt. Versuchen Sie, diese Methode aufzurufen, sagen wir, in einem temporären Button Click Event Handler. – EvAlex

Antwort

0

Sie können ein Tool wie Snoop verwenden oder WPF Inspector die visuelle Struktur Ihrer Kontrolle zu untersuchen. Wenn diese Tools dazu in der Lage sind, muss der Fehler irgendwo in Ihrem Code sein, richtig?

1

Wie von @GazTheDestroyer vorgeschlagen, möchten Sie sicherstellen, dass die Steuerelementvorlage angewendet wurde, bevor Sie versuchen, VisualTreeHelper zu verwenden. Versuchen Sie:

public void EnumVisual(Visual myVisual) 
{ 
    if(myVisual is FrameworkElement) 
     ((FrameworkElement)myVisual).ApplyTemplate(); 

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(myVisual); i++) 
    { 
     // Retrieve child visual at specified index value. 
     Visual childVisual = (Visual)VisualTreeHelper.GetChild(myVisual, i); 

     Button _button = childVisual as Button; 
     if (_button != null) 
     { 
      Class_Button _newButtonClass = new Class_Button(); 
      if (_button.Name != null) 
      { 
       _newButtonClass.ButtonName = _button.Name; 
      } 
      ButtonsList.Add(_newButtonClass); 
     } 

     // Enumerate children of the child visual object. 
     EnumVisual(childVisual); 

    } 
} 
Verwandte Themen