2013-08-01 13 views
8

Mam StackPanel, który jest pełen kontroli, próbuję przechodzić przez elementy i uzyskać ich nazwy, ale wydaje się, że muszę rzucić każdy element do jego typu, aby uzyskać dostęp do jego Name Właściwość.Pętla przez dzieci StackPanel w WPF

Ale co jeśli mam wiele różnych typów w StackPanel i chcę tylko uzyskać nazwę elementu?

Czy jest lepszy sposób to zrobić?

Oto co próbowałem:

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

Odpowiedz

15

To powinno wystarczyć, aby rzucić we właściwym klasy bazowej. Wszystko, co pochodzi od FrameworkElement, ma właściwość Name.

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

    if (childname != null) 
     ... 

} 
+0

Jak o '= (nazwa elementu potomnego dziecka jako FrameworkElement) ?. name;'? – Default

+0

To jest odpowiedź z 2013 roku, nie ma jeszcze "?.". Nie będę tego modernizował wszędzie. I nie jestem pewien, czy zawsze jest lepiej, tutaj dziecko '((FrameworkElement) .Nazwa' może być najbardziej zoptymalizowaną formą. –

+0

Tak, doszedłem do wniosku, skoro i tak edytowałeś odpowiedź. Widziałem datę. – Default

7

Być może po prostu użyć odpowiedniego typu dla zmiennej pętli foreach:

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

Działa to tak długo, jak istnieją tylko FrameworkElement kontrole uzyskane w panelu. Jeśli istnieją również inni (jak pochodzący z UIElement tylko) można napisać tak:

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

Używanie LINQ:

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