Перебор дочерних элементов StackPanel в WPF

У меня есть StackPanel, полный элементов управления, я пытаюсь просмотреть элементы и получить их имена, но кажется, что мне нужно привести каждый элемент к его типу, чтобы получить доступ к его свойству Name.

Но что, если у меня много разных типов в StackPanel, и я просто хочу получить имя элемента?

Есть ли лучший способ сделать это?

Вот что я пробовал:

foreach (object child in tab.Children)
{
    UnregisterName(child.Name);
}

person user1590636    schedule 01.08.2013    source источник


Ответы (3)


Этого должно быть достаточно для приведения к правильному базовому классу. Все, что происходит от FrameworkElement, имеет свойство Name.

foreach(object child in tab.Children)
{
   string childname = null;
   if (child is FrameworkElement )
   {
     childname = (child as FrameworkElement).Name;
   }

   if (childname != null)
      ...

}
person Henk Holterman    schedule 01.08.2013
comment
Как насчет childname = (child as FrameworkElement)?.Name;? - person Default; 13.06.2017
comment
Это ответ от 2013 года, ?. еще нет. Я не собираюсь переделывать это везде. И я не уверен, что это всегда лучше, здесь ((FrameworkElement)child).Name может быть наиболее оптимизированной формой. - person Henk Holterman; 13.06.2017
comment
Да, я понял, так как вы все равно редактировали ответ. Я видел дату. - person Default; 13.06.2017

Вы можете просто использовать соответствующий тип для переменной цикла foreach:

foreach (FrameworkElement element in panel.Children)
{
    var name = element.Name;
}

Это работает до тех пор, пока в Panel есть только FrameworkElement производных элементов управления. Если есть и другие (например, производные только от UIElement), вы можете написать это:

using System.Linq;
...
foreach (var element in panel.Children.OfType<FrameworkElement>())
{
    var name = element.Name;
}
person Clemens    schedule 01.08.2013

Использование LINQ:

foreach(var child in tab.Children.OfType<Control>)
{
    UnregisterName(child.Name);
}
person Marc    schedule 01.08.2013