Ссылка на объект требуется для нестатического поля, метода или ошибки свойства в новом обработчике событий.

Я знаю, что эта тема показана везде на SO, но я не смог найти ничего конкретного по этому поводу. У меня есть класс, который используется для хранения всех созданных мной окон для моего приложения. Я пытаюсь создать новое окно, если оно не существует, и прикрепить к нему некоторые события. Проблема в том, что события выдают ошибку.

Приведенный ниже фрагмент кода относится к классу, когда при возникновении события должно создаваться новое окно. Ниже приведены два определения обработчиков событий. Все они в одном классе.

Window window = FindWindow(windowId);
if (window == null)
{
    window = new Window();
    window.Closing += new System.ComponentModel.CancelEventHandler(window_Closing);
    window.Closed += new EventHandler(window_Closed);
    _winDict.Add(windowId, window);
}
window.Owner = Application.Current.MainWindow;
window.Title = title;
window.Content = guc;
window.SizeToContent = SizeToContent.WidthAndHeight;
window.ResizeMode = ResizeMode.NoResize;
window.ShowInTaskbar = false;

Код для двух обработчиков событий

void window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    throw new NotImplementedException();
}

void window_Closed(object sender, EventArgs e)
{
    throw new NotImplementedException();
}

Надеюсь, этой информации достаточно, чтобы помочь мне отладить проблему.

Заранее спасибо.


person Seb    schedule 10.09.2012    source источник


Ответы (2)


Если этот фрагмент кода появляется внутри статического метода, то указателя this нет, и вы не можете получить доступ к методам window_Closing и window_Closed.

Попробуйте сделать window_Closed и window_Closing статическими, чтобы увидеть, компилируется ли он, но имейте в виду, что у них также не будет указателя this.

Что, вероятно, является «настоящим» исправлением, так это, конечно, сделать метод нестатическим, а в текущем статическом методе создать экземпляр класса, а затем вызвать этот нестатический метод.

(Примечание: этот фрагмент не скомпилирован и не опробован)

class SomeClass
{
    static void CurrentFunc()
    {
        var someClass = new SomeClass();
        someClass.NewFunc();
    }

    private void NewFunc()
    {
        Window window = FindWindow(windowId);
        if (window == null)
        {
            window = new Window();
            window.Closing += new System.ComponentModel.CancelEventHandler(window_Closing);
            window.Closed += new EventHandler(window_Closed);
            _winDict.Add(windowId, window);
        }
        window.Owner = Application.Current.MainWindow;
        window.Title = title;
        window.Content = guc;
        window.SizeToContent = SizeToContent.WidthAndHeight;
        window.ResizeMode = ResizeMode.NoResize;
        window.ShowInTaskbar = false;
    }

    private void window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        throw new NotImplementedException();
    }

    private void window_Closed(object sender, EventArgs e)
    {
        throw new NotImplementedException();
    }
}
person Scott Earle    schedule 11.09.2012
comment
Спасибо за образец и указание мне в правильном направлении. - person Seb; 12.09.2012

Является ли метод, которым вы настраиваете обработчики событий, статическим методом? Если это так, он не сможет получить доступ к методам экземпляра 'window_Closing' и 'window_Closed'.

person Dave Doknjas    schedule 10.09.2012
comment
Это была очень моя ситуация. Спасибо. - person Seb; 12.09.2012