2012-03-26 79 views
3

我在wpf 4.0中包含用戶控件,其中包含按鈕,標籤,文本框等...... 我想循環這些控件,當我得到一個buuton時,我想把它的名字並將其保存到我的列表中。基本上,我想要做的就是在UserControl中創建我所有按鈕的Names_list。無法看到VisualTreeHelper中的用戶控件內的控件

我有遍歷所有控件的方法,如果它發現一個按鈕,這樣可以節省它的名字 -

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); 

     } 
    } 

我總是得到一個空列表。 當我通過調試進入代碼並觀看UserControl的VisualTree時,我看到所有Panels和GroupBoxes和Grids,但我沒有看到按鈕,標籤和texboxes,儘管每個控件都有ax:Name和每個控件都是x :FieldModifier = 「公共」。這是非常奇怪的....我不明白的原因,以及如何解決這個問題... 任何人都可以告訴我做錯了什麼? 感謝

+1

你打電話給EnumVisual()的時候?你確定這個模板已經被應用了嗎? – GazTheDestroyer 2012-03-26 10:38:18

+0

@GazTheDestroyer我創建了我的MainWindow,其中包含UserControl,並且在顯示它之後,我調用通過單擊menuItem來獲取按鈕列表的函數.....並且通過該點,我可以在MainWindow中看到UserControl ... – 2012-03-26 10:42:54

+0

這並不意味着UserControl已經被加載。在代碼輸入該方法的過程中,它可能處於進程的中間。嘗試調用該方法,例如,在一些臨時按鈕單擊事件處理程序 – EvAlex 2012-03-26 11:00:37

回答

0

您可以使用像SnoopWPF Inspector 一個工具來檢查你的控件的可視化樹。 如果這些工具能夠這樣做,錯誤必須在代碼中的某個地方,對吧?

1

正如@GazTheDestroyer所建議的,您希望在嘗試使用VisualTreeHelper之前確保已應用控件模板。嘗試:

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); 

    } 
}