2013-08-01 2 views
8

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

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

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

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

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

ответ

15

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

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

    if (childname != null) 
     ... 

} 
+0

Как насчет 'ChildName = (ребенок как FrameworkElement) ?. Имя;'? – Default

+0

Это ответ от 2013 года, еще не '? .'. Я не буду дорабатывать это везде. И я не уверен, что это всегда лучше, здесь '((FrameworkElement) child) .Name' может быть наиболее оптимизированной формой. –

+0

Да, я понял, что вы все равно редактировали ответ. Я видел дату. – Default

7

Вы можете просто использовать подходящий тип для переменной петли Еогеаспа:

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; 
} 
2

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

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