Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 在VisualTreeHelper中看不到用户控件内的控件_Wpf_C# 4.0_User Controls_Wpf Controls - Fatal编程技术网

Wpf 在VisualTreeHelper中看不到用户控件内的控件

Wpf 在VisualTreeHelper中看不到用户控件内的控件,wpf,c#-4.0,user-controls,wpf-controls,Wpf,C# 4.0,User Controls,Wpf Controls,我在WPF4.0中有UserControl,它包含按钮、标签、文本框等。。。。 我想循环那些控件,当我得到一个buuton时,我想把它的名字保存到我的列表中。基本上,我所要做的就是在UserControl中创建一个包含所有按钮的名称列表 我有一个迭代所有控件的方法,如果它找到一个按钮,它会保存它的名称- public void EnumVisual(Visual myVisual) { for (int i = 0; i < VisualTreeHelper.G

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

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

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

        }
    }
public void enumvisical(Visual myVisual)
{
for(int i=0;i
我总是得到一张空名单。 当我通过调试进入代码并观察UserControl的VisualTree时,我看到了所有面板、GroupBox和网格,但我看不到按钮、标签和文本框,尽管每个控件都有一个x:Name,每个控件都是x:FieldModifier=“public”。这是非常奇怪的…我不明白原因以及如何解决这个问题。。。 谁知道我做错了什么? 谢谢

您可以使用以下工具 或 检查控件的可视树。
如果这些工具能够做到这一点,那么错误一定在代码中的某个地方,对吗?

正如@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);

    }
}
public void enumvisical(Visual myVisual)
{
如果(myVisual是FrameworkElement)
((FrameworkElement)myVisual.ApplyTemplate();
for(int i=0;i
您何时调用EnumVisual()?你确定该模板已应用于该点吗?@GazTheDestroyer我创建了我的主窗口,其中包含UserControl,显示后,我调用函数,通过单击菜单项获取按钮列表……此时我可以在主窗口中看到UserControl……这并不意味着UserControl已加载。它可能在您的代码进入该方法的过程的中间。尝试调用该方法,比如说,在某个临时按钮单击事件中handler@EvAlex你说得对……用户控件放在其中一个选项卡项上,只有在我打开选项卡并实际看到用户控件之后,它的按钮出现在按钮列表中…我不明白为什么会生成面板,而其中的控件不是…谢谢您的帮助:)元素是以自底向上的方式初始化的,因此按钮应该在其容器之前初始化。在渲染之前。如何将这些按钮添加到UserControl?我想不是在XAML里吧?