以编程方式添加多个扩展器事件不起作用

本文关键字:扩展器 事件 不起作用 编程 方式 添加 | 更新日期: 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