以不同的方式在wpf Grid中搜索子节点

问题描述 投票:0回答:1

我正在使用一个wpf网格,其中的列和行是从代码隐藏中动态设置的(用户可以更改列数和行数)。

如果我使用foreach循环来定位网格(单元格)中的子对象,它将从“从上到下”搜索,意思是从col = 0 row = 0中的单元格然后col = 0 row = 1等等...我想要的是从“从左到右”搜索,即row = 0 col = 0然后row = 0 col = 1等等......

我在List <>中添加子元素的顺序非常重要。

我知道我可以使用两个嵌套的for循环,但有更优雅(更快)的方法吗?

(Cell是UserControl)

List<Cell> cells = new List<Cell>();
foreach (Cell c in mainGrid.Children)
{
  cells.Add(c);
}

//...

for (int i = 0; i < mainGrid.RowDefinitions.Count; i++)
{
    for (int j = 0; j < mainGrid.ColumnDefinitions.Count; j++)
    {
        Cell cell = (Cell)mainGrid.Children.Cast<UIElement>()
                          .First(c => Grid.GetRow(c) == i && Grid.GetColumn(c) == j);
        cells.Add(cell);            
    }
}
c# wpf
1个回答
1
投票

如果我使用foreach循环来定位网格(单元格)中的子对象,它将从“从上到下”进行搜索

这实际上不是真的。它只是按照您将它们添加到Grid的Children集合中的顺序返回子节点,这与它们在Grid中的位置无关。您碰巧按顺序获取它们的原因是因为它们按顺序添加到Grid中。

如果你想要一个更“优雅”的方式来做到这一点(虽然可能不会快得多),你可以使用linq的OrderByThenBy以及附加的Grid.RowGrid.Column属性。

List<Cell> cells = mainGrid.Children
    .OfType<Cell>()
    .OrderBy(Grid.GetRow)
    .ThenBy(Grid.GetColumn)
    .ToList();

此解决方案也比您的示例有点健壮,因为如果网格行或列没有单元格,它将不会失败。

© www.soinside.com 2019 - 2024. All rights reserved.