我想访问包含列和行的网格内的所有元素。
我对我找到的方法进行了编辑,但它总是返回null。
private static FrameworkElement GetChildren(Grid grid, int row, int column)
{
FrameworkElement fr = null;
foreach (FrameworkElement child in grid.Children)
{
if ((Grid.GetRow(child) == row) && (Grid.GetColumn(child) == column))
{
fr = child;
}
else
{
fr = null;
}
}
return fr;
} //getchildren
答案 0 :(得分:1)
您的方法是正确的,但您的算法是错误的。
假设网格包含两个元素。第一个是你要搜索的那个。
foreach
枚举所有控件,并返回第一个控件。它是正确的行和列,因此您将其分配给fr
。
foreach
继续并返回第二个。这不是正确的行/列,因此您将null
分配给fr
。
foreach
循环已完成枚举元素,并返回fr
,为空。
基本上,只有当元素是网格的最后一个子节点时,您的代码才会起作用。
要修复算法,请在找到控件时使用break
指令退出循环:
FrameworkElement fr = null;
foreach (FrameworkElement child in grid.Children)
{
if ((Grid.GetRow(child) == row) && (Grid.GetColumn(child) == column))
{
fr = child;
break;
}
}
return fr;
或者,您可以使用Linq缩短代码:
return grid.Children
.OfType<FrameworkElement>()
.FirstOrDefault(child => Grid.GetRow(child) == row && Grid.GetColumn(child) == column);