2013-08-01 111 views
8

循环我有一个StackPanel是充满控制,我通过元素试图循环,并得到他们的名字,但似乎我需要给每个元素转换为它的类型,以便访问其Name财产。通过StackPanel的儿童在WPF

但是如果我有很多不同类型的在StackPanel中,我只是想获得元素的名字吗?

有没有更好的方式来做到这一点?

这里是我试过:

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

回答

15

这应该足以强制转换为正确的基类。从FrameworkElement下降 任何事物都有一个名称属性。

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循环变量相应类型:

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