以编程方式添加多个扩展器事件不起作用
本文关键字:扩展器 事件 不起作用 编程 方式 添加 | 更新日期: 2023-09-27 18:25:35
我在将Expanded事件添加到Expanders时遇到问题。我的窗口上有扩展器,我想得到效果,当我扩展扩展器时,所有其他的都会下降。我编写的函数可以让我做到这一点,而且它工作正常。问题是我有96个扩展器,我不想为Expand添加96个事件,为Collapse添加96个活动,所以我认为我可以通过编程添加它。
看看代码:
private void InitExpanders()
{
var expanders = GetExpanders(); // List<Expander> - list of expanders
for (int i = 0; i < expanders.Count; i++)
{
if (i % 6 == 1)
{
expanders[i - 1].Expanded += new RoutedEventHandler(delegate(object sender, RoutedEventArgs args)
{
DisableBigExpanders(1); // problem is here!
});
}
}
}
此代码运行良好,但对于每个扩展器,函数参数将为1。我试着把整数加起来,然后再递增,但不起作用。
private void InitExpanders()
{
var expanders = GetExpanders();
int x = 0;
for (int i = 0; i < expanders.Count; i++)
{
if (i % 6 == 1)
{
expanders[i - 1].Expanded += new RoutedEventHandler(delegate(object sender, RoutedEventArgs args)
{
DisableBigExpanders(x);
});
x++;
}
}
}
感谢所有回复。
我怀疑您在委托中发现的x总是它在循环中达到的最高值。这是由于编译器实例化您定义的匿名方法实例的方式造成的。它查看委托周围捕获的外部变量,并决定它是否需要单独的实例,或者是否可以使用单个实例。在这种情况下,您没有捕获的外部变量;因此,编译器被允许使用委托的相同实例,从而使用x的相同值。
为了解决这个问题,你所需要做的就是在委托之前添加一个更细粒度的变量,并为其赋值x。这将起作用:
private void InitExpanders()
{
var expanders = GetExpanders();
int x = 0;
for (int i = 0; i < expanders.Count; i++)
{
if (i % 6 == 1)
{
int y = x++;
expanders[i - 1].Expanded += delegate
{
DisableBigExpanders(y);
};
}
}
}
有关该理论的更多信息,请参阅此处:http://en.csharp-online.net/ECMA-334%3A_14.5.15.4_Anonymous_method_evaluation