Передача метода в класс для EventHandlers - PullRequest
0 голосов
/ 21 марта 2011

Используя отдельный класс, который делается повторно используемым, нужно передать ему функцию, которая будет вызываться при событии щелчка из контекстного меню ...

Проблема: Функции не являются типом 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 ]

2 голосов
/ 21 марта 2011

Я предполагаю, что проблема в том, что ваш метод 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();
}
0 голосов
/ 21 марта 2011

Это немного смело, но вы, вероятно, могли бы сделать

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

, что имеет недостаток в том, что невозможно удалить обработчик событий снова, если это необходимо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...