C# 单击函数以生成元素
我有一个通过代码填充的网格。这是我的实现:C# 单击函数以生成元素,c#,wpf,events,user-interface,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.So
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);
}
}
for(inti=1;i您可以利用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表达式附加到Image
实例的MouseUp
事件,该实例将使用适当的值调用函数。lambda表达式将关闭这些变量,即使这些变量离开作用域,它也会记住它们的值
这里的关键是,您需要使用局部作用域变量作为参数。这样做,您将创建一个新的行
和列
副本,每个循环都将通过。更具体地说,您可以不使用func(i,j)
——lamba将“记住”i
和j
拥有的最后一个值,并且在所有9个图像上始终调用func(3,3)
。您可以将图像绑定到类似
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));
}