我有一个通过代码填充的网格。这是我的实施:
for (int i = 1; i <= 3; i++)
{
for (int j = 0; j < 3; j++)
{
Image oImage = new Image();
Window.myGrid.Children.Add(oImage);
oImageSource.UriSource = oImageUri;
oImage.Source = oImageSource;
Grid.SetRow(oImage, i);
Grid.SetColumn(oImage, j);
}
}
我正在寻找一种解决方案,通过它,我将能够做到下一步:
当有人点击我作为孩子添加的对象oImage
时,会触发一个功能,并且插槽的行和列将是它的参数。
因此,如果我有下一个网格(每个数字代表一个附加到网格的对象):
单击9
将触发函数func(2, 2)
(行和列的索引为2)
答案 0 :(得分:1)
您可以利用lambda表达式的闭包功能来完成这项工作,但您必须小心。
在内部for
循环中,您可以执行以下操作:
Image oImage = new Image();
Window.myGrid.Children.Add(oImage);
var row = i;
var col = j;
oImage.MouseUp += (sender, args) => func(row, col);
这会将指定的lambda表达式附加到MouseUp
实例的Image
事件,该事件将使用适当的值调用您的函数。即使在离开范围之后,lambda表达式也将关闭这些变量,并且它将记住它们的值。
这里的关键是您需要使用本地范围的变量作为参数。通过这样做,您将创建row
和col
的新副本,每个副本都通过循环。更具体地说,您可以 不 使用func(i,j)
- lamba将“记住”i
和j
具有的最后一个值,并且将始终在所有9张图片上调用func(3,3)
。
答案 1 :(得分:1)
您可以将图像绑定到像
这样的处理程序oImage.MouseUp +=new MouseButtonEventHandler(oImage_MouseUp);
然后在处理程序中,您可以使用Grid.GetColumn和Grid.GetRow来获取属性
private void oImage_MouseUp(object sender, MouseButtonEventArgs e)
{
Image bb = (Image)sender;
func(Grid.GetRow(bb), Grid.GetColumn(bb));
}