无法在VisualTreeHelper中查看用户控件内的控件

时间:2012-03-26 10:34:09

标签: wpf c#-4.0 user-controls wpf-controls

我在wpf 4.0中有UserControl,其中包含按钮,标签,文本框等.... 我想循环这些控件,当我得到一个buuton时,我想把它的名字保存到我的列表中。基本上,我想要做的就是在UserControl中创建所有按钮的Names_list。

我有一个迭代所有控件的方法,如果找到一个按钮,它会保存它的名字 -

  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,但我看不到按钮,标签和texbox,虽然每个控件都有ax:Name和每个控件都是x: FieldModifier = “公共”。这很奇怪......我无法理解其中的原因以及如何解决这个问题...... 谁能说出我做错了什么? 谢谢

2 个答案:

答案 0 :(得分: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);

    }
}

答案 1 :(得分:0)

您可以使用Snoop之类的工具 或WPF Inspector 检查控件的可视树。 如果这些工具能够这样做,那么错误必须在代码中的某个地方,对吧?

相关问题