2012-03-26 73 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); 

    } 
} 
相关问题