我正在使用一个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);
}
}
如果我使用foreach循环来定位网格(单元格)中的子对象,它将从“从上到下”进行搜索
这实际上不是真的。它只是按照您将它们添加到Grid的Children集合中的顺序返回子节点,这与它们在Grid中的位置无关。您碰巧按顺序获取它们的原因是因为它们按顺序添加到Grid中。
如果你想要一个更“优雅”的方式来做到这一点(虽然可能不会快得多),你可以使用linq的OrderBy
和ThenBy
以及附加的Grid.Row
和Grid.Column
属性。
List<Cell> cells = mainGrid.Children
.OfType<Cell>()
.OrderBy(Grid.GetRow)
.ThenBy(Grid.GetColumn)
.ToList();
此解决方案也比您的示例有点健壮,因为如果网格行或列没有单元格,它将不会失败。