点击功能生成元素

时间:2012-07-28 21:54:24

标签: c# wpf events user-interface

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

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)

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表达式也将关闭这些变量,并且它将记住它们的值。

这里的关键是您需要使用本地范围的变量作为参数。通过这样做,您将创建rowcol的新副本,每个副本都通过循环。更具体地说,您可以 使用func(i,j) - lamba将“记住”ij具有的最后一个值,并且将始终在所有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));
    }