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

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

我在 wpf 4.0 中有 UserControl,其中包含按钮、标签、文本框等......
我想循环这些控件,当我得到一个按钮时,我想取它的名字并将其保存到我的列表中。基本上,我要做的就是在 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 但我没有看到按钮、标签和 texboxes,尽管每个控件都有一个 x:Name 并且每个控件都是 x:字段修饰符 =“公共(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);

    }
}

关于wpf - 在 VisualTreeHelper 中看不到用户控件内的控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9870560/

相关文章:

c# - 仅基于日期的日期时间差异(以天为单位)

c# - 如何垂直 "center"对齐多行文字

c# - 使用 C# 将单个 Int 从一个用户控件传递到另一个用户控件

WPF 控件模板与用户控件

wpf - TextBlock 填充垂直空间

c# - 如何阻止引发 datagridview 中的双击事件?

c# - 如何从 WPF RichTextBox 的 TextChangedEventArgs 中提取更改

javascript - 将值分配给在页面加载时从 javascript 函数获得的文本框

wpf - MVVM解决方案中的WPF工具包日历控件,如何突出显示日期?

wpf - 从后面的代码更改样式