Цикл через дочерние элементы StackPanel в WPF

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

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

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

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

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

3 ответов


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

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

   if (childname != null)
      ...

}

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

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

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

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

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

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