2013-03-03 2 views
0

У меня есть StackPanel с некоторыми WrapPanel. внутри каждого WrapPanel расположены два элемента:Получить детей UIElement от нескольких родителей

<StackPanel FlowDirection="RightToLeft" Grid.Column="2" Grid.Row="1" Name="check_boxes_layout"> 
    <WrapPanel> 
     <CheckBox Name="chk1" Checked="Checked_Changed" Unchecked="Unchecked"></CheckBox> 
     <Rectangle Width="50" Fill="Red" Name="rec1" Margin="10 2 2 2"/> 
    </WrapPanel> 
    <WrapPanel> 
     <CheckBox Name="chk12" Checked="Checked_Changed" Unchecked="Unchecked"></CheckBox> 
     <Rectangle Width="50" Fill="Blue" Name="rec2" Margin="10 2 2 2"/> 
    </WrapPanel> 
<StackPanel/> 

Я хочу, чтобы все дети флажком типа .как я могу это сделать?

foreach (var item in check_boxes_layout.Children.OfType<CheckBox>()) 
{ 
    //this code just return Wrap Panel 
} 

Thank You in Advance.

ответ

2

Используйте эту рекурсивную функцию:

List<UIElement> GetAllChildren(Panel c) 
{ 
    List<UIElement> list = c.Children.Cast<UIElement>().ToList(); 
    foreach(var elem in list.OfType<Panel>()) 
     list.AddRange(GetChildren(elem)); 
    return list; 
} 

Нет вы можете сказать:

foreach (var item in GetAllChildren(check_boxes_layout).OfType<CheckBox>()) 
{ 
    //... 
} 
0

я получил его первую петлю через варп панелей и получить его ребенок

foreach (WrapPanel warppanel in check_boxes_layout.Children) 
{ 
    foreach (var item in warppanel.Children.OfType<CheckBox>) 
    { 
      . 
      . 
      . 
    } 
} 
+0

Что делать, если у вас есть другой 'Panel' или' Grid' внутри 'WrapPanel'? Мой ответ обрабатывает любой уровень гнездования. –

+0

@ MD.Unicorn: Я знаю, что ваш ответ более завершен. – KF2

+0

@ MD.Unicorn, этот (OP) ответ ответ на OP * текущий * вопрос. Тем не менее это не очень хорошее решение, потому что оно зависит от текущего макета: он будет терпеть неудачу, если будут введены новые панели. То есть, это не будущее. –

Смежные вопросы