要在控件上创建新的事件处理程序,您可以执行此操作
c.Click += new EventHandler(mainFormButton_Click);
Run Code Online (Sandbox Code Playgroud)
或这个
c.Click += mainFormButton_Click;
Run Code Online (Sandbox Code Playgroud)
并删除事件处理程序,您可以执行此操作
c.Click -= mainFormButton_Click;
Run Code Online (Sandbox Code Playgroud)
但是如何从事件中删除所有事件处理程序?
基本前提:
我有一个房间,当一个阿凡达"进入"房间内的所有头像时,它会发布一个事件.当阿凡达离开房间时,我希望它删除该房间的所有订阅.
在将"阿凡达"添加到新房间并订阅新房间的活动之前,我怎样才能最好地取消订阅房间中所有活动的阿凡达?
代码如下:
class Room
{
public event EventHandler<EnterRoomEventArgs> AvatarEntersRoom;
public event EvnetHandler<LeaveRoomEventArgs> AvatarLeavesRoom;
public event EventHandler<AnotherOfManyEventArgs> AnotherOfManayAvatarEvents;
public void AddPlayer(Avatar theAvatar)
{
AvatarEntersRoom(this, new EnterRoomEventArgs());
AvatarEntersRoom += new EventHandler<EnterRoomEventArgs>(theAvatar.HandleAvatarEntersRoom);
AvatarLeavesRoom += new EventHandler<EnterRoomEventArgs>(theAvatar.HandleAvatarEntersRoom);
AnotherOfManayAvatarEvents += new EventHandler<EnterRoomEventArgs>(theAvatar.HandleAvatarEntersRoom);
}
}
class Avatar
{
public void HandleAvatarEntersRoom(object sender, EnterRoomEventArgs e)
{
Log.Write("avatar has entered the room");
}
public void HandleAvatarLeaveRoom(object sender, LeaveRoomEventArgs e)
{
Log.Write("avatar has left room");
}
public void HandleAnotherOfManayAvatarEvents(object sender, AnotherOfManyEventArgs e)
{
Log.Write("another avatar event has …Run Code Online (Sandbox Code Playgroud) 让我们说我们有一个代表
public delegate void MyEventHandler(string x);
Run Code Online (Sandbox Code Playgroud)
和一个事件处理程序
public event MyEventHandler Something;
Run Code Online (Sandbox Code Playgroud)
我们添加了多个事件..
for(int x = 0; x <10; x++)
{
this.Something += HandleSomething;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是..如何从事件处理程序中删除所有方法,假设一个人不知道它已被添加10(或更多或更少)次?
假设我派生了一个WPF控件,例如TextBox,我重写其中一个On-方法,例如OnInitialized
假设我这样做了: this.Initialized += delegate { };
如果包含此控件的窗口关闭 - 如果没有其他操作,这会导致内存泄漏吗?
如果这确实导致内存泄漏,那么实现Finalizer是否是一个足够的,最小的补救措施?