#c# #wpf #events
#c# #wpf #Мероприятия
Вопрос:
Существует контекст:
Class A{
public void mymethod(){
MyWindow window = new MyWindow();
window.Show();
}
}
public partial class MyWindow: Window
{
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
//Some Code Here
}
}
Могу ли я выполнить в myMethod : MyWindow.Closing -= (_,__) => {};
игнорировать запись кода в Window_Closing ?
Комментарии:
1. почему бы не попробовать это?
2. почему у вас есть обработчик событий, который вы не хотите выполнять?
3. @HimBromBeere Я не смог выполнить тест, потому что у меня не было доступной среды разработки, когда я задавал вопрос. (спрашивается с моего телефона)
4. @HimBromBeere И для очень конкретного случая, из-за исключения, которое не может быть обработано внутри MyWindow, данные, сохраненные с использованием событий, не должны сохраняться в этом случае.
Ответ №1:
Нет, это невозможно. События являются делегатами многоадресной рассылки, что означает, что событие содержит набор обратных вызовов, поэтому синтаксис =
и -=
и не только =
. События в C # компилируются не так, как они «кажутся» в коде. Внешне по отношению к классу, раскрывающему событие, единственными операциями, которые могут быть выполнены, являются добавление и удаление обратных вызовов. Внутри класса, объявляющего событие, доступны другие действия (вызов обратных вызовов событий, доступ к списку регистраций …), Но это уже другая тема.
Чтобы удалить уже добавленный обратный вызов, вам необходимо иметь ссылку на этот конкретный обратный вызов, который в вашем случае предназначен MyWindow.Window_Closing
для каждого MyWindow
экземпляра, метод на данный момент является закрытым, поэтому вы не можете. Если MyWindow.Window_Closing
было общедоступным, вы могли бы сделать:
window.Closing -= window.Window_Closing
Но это сработало бы только для этого обратного вызова, если бы другие классы также были подписаны на событие, о котором они будут уведомлены, вы не можете получить доступ ко всем обратным вызовам извне класса, объявляющего событие.