Wpf 您应该何时注册/取消注册事件/消息

Wpf 您应该何时注册/取消注册事件/消息,wpf,silverlight,mvvm-light,Wpf,Silverlight,Mvvm Light,我正在查看应用程序中的事件和消息,但不确定它们的生命周期以及您应该注册它们的时间 此时,在控件的构造函数中,我注册以接收消息(或事件处理程序)。我没有注销,但我认为这是一个错误 例如,在这篇文章中:它说在unload事件中取消注册 在我的应用程序中,我使用Telerik控件(可能发生在其他控件中),并且在主屏幕中有一个窗口。当我松开屏幕时,在其他时间,卸载和加载事件会触发,即使窗口本身似乎没有关闭 因此,如果我在卸载的中取消注册,那么它将导致一个问题。那么我应该在什么时候这样做呢?一般来说,当我

我正在查看应用程序中的事件和消息,但不确定它们的生命周期以及您应该注册它们的时间

此时,在控件的构造函数中,我注册以接收消息(或事件处理程序)。我没有注销,但我认为这是一个错误

例如,在这篇文章中:它说在
unload
事件中取消注册

在我的应用程序中,我使用Telerik控件(可能发生在其他控件中),并且在主屏幕中有一个窗口。当我松开屏幕时,在其他时间,
卸载
加载
事件会触发,即使窗口本身似乎没有关闭


因此,如果我在卸载的
中取消注册,那么它将导致一个问题。那么我应该在什么时候这样做呢?

一般来说,当我知道事件不再相关时,我会立即注销它们,这可能会有所不同。如果卸载正在发生,但窗口仍保持不变,那么加载也在发生(正如您所提到的)。在这种情况下,也许您应该在load中注册它们,并在unload中注销它们。这应该保证匹配。如果在userControl/页面的生命周期内需要卸载,我看不到比卸载更好的事件。一般来说,我会在知道事件不再相关时立即注销事件,这可能会有所不同。如果卸载正在发生,但窗口仍保持不变,那么加载也在发生(正如您所提到的)。在这种情况下,也许您应该在load中注册它们,并在unload中注销它们。这应该保证匹配。如果在userControl/页面的生命周期中需要卸载,我看不到比卸载更好的事件。一般来说,我同意,但在某些情况下,加载和卸载事件处理程序会多次调用。我通过在寄存器之前添加bool变量进行检查来解决这个问题

示例代码:

bool _hasRegistered; // default value is false

OnLoaded()
{
    //
    if (!this._hasRegistered)
    {
        // your register code here
        this._hasRegistered = true;
    }
}

OnUnloaded()
{
    // your un-register code here
}
一般来说,我同意,但在某些情况下,加载和卸载事件处理程序调用不止一次。我通过在寄存器之前添加bool变量进行检查来解决这个问题

示例代码:

bool _hasRegistered; // default value is false

OnLoaded()
{
    //
    if (!this._hasRegistered)
    {
        // your register code here
        this._hasRegistered = true;
    }
}

OnUnloaded()
{
    // your un-register code here
}

我在这方面预见到的问题是,在注销事件的瞬间,可能会引发并错过一个事件。我不确定是什么在生成您的事件,但如果它超出了控制范围,您可以在外部注册它并在内部调用一个方法。如果事件所属的项在该控件/页面中,那么它们在该控件/页面中的挂起应该不会有任何问题,因为当控件处于活动状态时,它们应该被销毁(尽管我更喜欢注销我注册的任何内容)。然而,总的来说,这并不能真正回答你的问题:(你正在注册什么样的事件?比如它附加到了什么?我忍不住想,如果它直接绑定到你的窗口/页面/控件上的某个东西上,那么它在再次加载时就无法触发。)这将是一条从XMPP服务器发送的消息,因此它可能会在再次加载时触发不幸我收回了我之前所说的。如果发布事件以从XMPP服务器接收的东西在窗口/控件完全关闭时处于活动状态,那么这些事件处理程序将一直保留,直到该对象超出范围并获取垃圾collected。您是否维护现有打开窗口的列表?如果是这样,我认为您将不得不将事件的注册和注销转移到处理跟踪窗口本身的方法。我在这方面预见的问题是,在注销事件的瞬间,可能会引发一个事件并将其忽略d、 我不确定是什么在生成您的事件,但是如果它在该控件之外,您可以在该控件之外注册它并在内部调用一个方法。如果该事件所属的项在该控件/页面中,那么它们在该控件中的挂起不应该有任何问题,因为当该控件被激活时,它们应该被销毁(虽然我更喜欢注销我注册的任何东西)。但是,总的来说,这并不能真正回答你的问题:(你注册的是什么类型的事件?比如它附加了什么?我忍不住想,如果它直接绑定到你的窗口/页面/控件上的某个东西,那么它在再次加载时就无法启动。)。(例如控件)这将是一条从XMPP服务器发送的消息,因此它可能会在再次加载时触发不幸我收回了我之前所说的。如果发布事件以从XMPP服务器接收的东西在窗口/控件完全关闭时处于活动状态,那么这些事件处理程序将一直保留,直到该对象超出范围并获取垃圾collected。您是否维护现有打开窗口的列表?如果是这样,我认为您必须将事件的注册和注销转移到处理跟踪窗口本身的方法。好主意。有时最简单的事情我不知道。好主意。有时最简单的事情我不知道。