【问题标题】:Get UIElement children from multiple parent从多个父级获取 UIElement 子级
【发布时间】:2013-03-03 09:26:27
【问题描述】:

我有一个 StackPanel 和一些 WrapPanel 。在每个WrapPanel 里面有两个元素:

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

提前致谢。

【问题讨论】:

    标签: c# wpf uielement


    【解决方案1】:

    使用这个递归函数:

    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>())
    {
        //...
    }
    

    【讨论】:

      【解决方案2】:

      我首先通过扭曲面板循环并获得它的孩子

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

      【讨论】:

      • 如果WrapPanel 中还有另一个PanelGrid 怎么办?我的答案可以处理任何级别的嵌套。
      • @MD.Unicorn,这个(OP 的)答案确实回答了 OP 的 current 问题。尽管如此,这并不是一个很好的解决方案,因为它取决于当前的布局:如果引入新面板,它将失败。也就是说,它不是面向未来的。
      猜你喜欢
      • 1970-01-01
      • 2011-06-27
      • 2020-01-14
      • 2019-05-11
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多