我在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 = “公共”。这很奇怪......我无法理解其中的原因以及如何解决这个问题...... 谁能说出我做错了什么? 谢谢
答案 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 检查控件的可视树。 如果这些工具能够这样做,那么错误必须在代码中的某个地方,对吧?