1

可能重复:
将参数传递给事件处理程序

我正在尝试处理从MenuItem.Click. 问题是,我需要一些方法来传递一些自定义参数(特别是代表行和列的两个整数)。

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    ...
    MenuItem froNewChild = new MenuItem();
    froNewChild.Header = "Insert new box";
    froNewChild.Click += new RoutedEventHandler(froNewChild_Click);
    // froNewChild.Click += new RoutedEventHandler(froNewChild_Click, column, row);
    FlowRectangleOptions.Items.Add(froNewChild);
    ...
}

private void froNewChild_Click(object sender, RoutedEventArgs e) //+column & row
{
    FlowDocument.allColumns[column-1].AddFlowRectangle(column, row);
    FlowDocument.ReRenderAll(canvas1);
}

这个答案将参数传递给事件处理程序似乎可以满足我的要求,但不能按原样工作,因为sender已在此范围内定义。可悲的是,我还没有足够的知识来解决这个问题 - 非常感谢您的建议!

4

3 回答 3

2

假设在您加载的方法中创建了“列”和“行”,您可以只使用 Lambda 事件处理程序,以便您可以传入变量。

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        //Assumming "column" and "row" are in this block somewhere.
        ...
        MenuItem froNewChild = new MenuItem();
        froNewChild.Header = "Insert new box";
        froNewChild.Click += (s, eArgs) =>
        {
            FlowDocument.allColumns[column - 1].AddFlowRectangle(column, row);
            FlowDocument.ReRenderAll(canvas1);
        };
        FlowRectangleOptions.Items.Add(froNewChild);
        ...
    }
于 2013-01-03T21:54:53.670 回答
0

传递给 evant 处理程序的参数取决于提升类的设计方式,它们作为派生类EventArgs作为第二个参数传递。除非您是引发事件的类的设计者,否则无法增强此功能。在这种特殊情况下,我们正在谈论一个框架类,因此根本不可能。

作为一种解决方法,您可以在类中定义一些状态成员变量并使用它们将信息传递给处理程序。

于 2013-01-03T21:51:53.307 回答
0

sa_ddam213 已经回答了你,但只是为了澄清一下:lambda 表达式中的参数名称没有语义含义,可以是你想要的任何东西。名称 sender 和 eventArgs 仅用于在您链接的问题中清晰。在这种情况下,重要的是有两个参数,编译器自己推断其余的。

column 和 row 的值将在您定义 lambda 时被捕获,并且在事件处理程序执行时可用,即使 MainWindow_Loaded 早已返回并且原始变量已销毁。

有关 C# 中 lambda 表达式的更多信息:http: //msdn.microsoft.com/en-us/library/bb397687.aspx

于 2013-01-03T22:06:51.173 回答