我在 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/