Wpf 在VisualTreeHelper中看不到用户控件内的控件
我在WPF4.0中有UserControl,它包含按钮、标签、文本框等。。。。 我想循环那些控件,当我得到一个buuton时,我想把它的名字保存到我的列表中。基本上,我所要做的就是在UserControl中创建一个包含所有按钮的名称列表 我有一个迭代所有控件的方法,如果它找到一个按钮,它会保存它的名称-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
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里吧?