0

我有一个通过代码填充的网格。这是我的实现:

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我作为孩子添加的对象时,将触发一个函数,并且插槽的将是它的参数。

因此,如果我有下一个网格(每个数字代表一个附加到网格的对象):

1 | 2 | 3

4 | 5 | 6

7 | 8 | 9

点击9会触发功能func(2, 2)(行和列的索引为2)

4

2 回答 2

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将始终调用func(3,3)所有 9 个图像。

于 2012-07-28T23:13:05.090 回答
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));
    }
于 2012-07-29T04:47:16.373 回答