【问题标题】:Passing custom arguments to event handler [duplicate]将自定义参数传递给事件处理程序[重复]
【发布时间】:2013-01-03 21:44:50
【问题描述】:

可能重复:
Passing arguments to event handler

我正在尝试处理从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);
}

此答案Passing arguments to an event handler 似乎可以满足我的要求,但不能按原样工作,因为sender 已在此范围内定义。遗憾的是,我还没有足够的知识来解决这个问题 - 非常感谢您的建议!

【问题讨论】:

  • 哦,总是这样,尝试几个小时,然后在发布问题 4 分钟后弄清楚。忽略这个!但是,如果您对此感兴趣,请感谢 :)
  • columnrow 的值是从哪里来的?在某处有DataGrid 吗?
  • 仅供阅读本文的任何人参考,解决方案如stackoverflow.com/questions/12293471/… 中所述,但我最终认为“发件人”可以命名为其他名称!

标签: c# .net wpf .net-4.0 event-handling


【解决方案1】:

假设“列”和“行”是在您加载的方法中创建的,您可以只使用 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);
        ...
    }

【讨论】:

  • 谢谢,这样就可以了。正如我认为你暗示我的设计重新行和列有一个小缺陷,但没关系,现在只是从错误中学习;)
  • 如果代码正常工作,它没有缺陷:)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      相关资源
      最近更新 更多