Не могу увидеть элементы управления внутри пользовательского элемента управления в VisualTreeHelper - PullRequest
3 голосов
/ 26 марта 2012

У меня есть UserControl в wpf 4.0, который содержит кнопки, метки, текстовые поля и т.д .... Я хочу зациклить эти элементы управления, и когда я получаю buuton, я хочу взять его имя и сохранить его в моем списке. По сути, все, что я хочу сделать, - это создать Names_list для всех моих кнопок в 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);

        }
    }

Я всегда получаю пустой список. Когда я вхожу в код, отлаживая его, и смотрю VisualTree моего UserControl, я вижу все панели и групповые ящики и сетки, но не вижу кнопок, меток и текстовых окон, хотя у каждого элемента управления есть ax: Name, и каждый элемент управления x: FieldModifier = "общественность". Это очень странно .... И я не могу понять причину этого, а также как решить эту проблему ... кто-нибудь может сказать, что я делаю не так? спасибо

Ответы [ 2 ]

1 голос
/ 29 августа 2012

По предложению @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);

    }
}
0 голосов
/ 18 июля 2012

Вы можете использовать такой инструмент, как Snoop или инспектор WPF изучить визуальное дерево вашего контроля. Если эти инструменты способны сделать это, ошибка должна быть где-то в вашем коде, верно?

...