将方法传递给EventHandlers的类

时间:2011-03-21 20:02:43

标签: c# .net event-handling

使用一个可重用的单独类,需要传递一个函数,该函数将从上下文菜单中的click事件中调用...

问题:函数不是类型EventHandlers ....还有不同的EventHandlers需要不同的参数...例如退出按钮的OnClose ....

编辑:

在第X类

public void AddMenuItem(String name, EventHandler target )
    {
        MenuItem newItem = new MenuItem();
        newItem.Index = _menuItemIndex++;
        newItem.Text = name;
        newItem.Click += target;

        _contextMenu.MenuItems.Add(newItem);
    }

在Wpf中:

addToTray.AddMenuItem("&Exit", Exit); 

我希望它链接到以下方法,但此时任何方法都可以。

private void ShouldIExit(object sender, System.ComponentModel.CancelEventArgs e)
    {
        // checks if the Job is running and if so prompts to continue
        if (_screenCaptureSession.Running())
        {
            MessageBoxResult result = System.Windows.MessageBox.Show("Capturing in Progress. Are You Sure You Want To Quit?", "Capturing", MessageBoxButton.YesNo);
            if (result == MessageBoxResult.No)
            {
                e.Cancel = true;
                return;
            }
        }
        _screenCaptureSession.Stop();
        _screenCaptureSession.Dispose();
    }

2 个答案:

答案 0 :(得分:2)

我猜测问题是您的ShouldIExit方法与EventHandler委托不匹配。尝试更改它以获取常规EventArgs参数,并查看是否有效。最好避免为不同的事件类型重用相同的事件处理程序。您应该将公共代码封装到单独的方法中,然后让不同的处理程序调用该代码。

private bool CheckExit()
{
    // checks if the Job is running and if so prompts to continue
    if (_screenCaptureSession.Running())
    {
        MessageBoxResult result = System.Windows.MessageBox.Show("Capturing in Progress. Are You Sure You Want To Quit?", "Capturing", MessageBoxButton.YesNo);
        if (result == MessageBoxResult.No)
        {
            return false;
        }
    }
    _screenCaptureSession.Stop();
    _screenCaptureSession.Dispose();
    return true;
}

private void ExitButtonClicked(object sender, System.ComponentModel.CancelEventArgs e)
{
    if (!CheckExit())
    {
        e.Cancel = true;
    }
}

private void ExitMenuItemClicked(object sender, EventArgs e)
{
    CheckExit();
}

答案 1 :(得分:0)

这有点模糊,但你可以做到

 OnClose += (sender,e) => YourFunction(...)

其缺点是,如果需要,无法再次删除事件处理程序