MainWindow.Closing事件并不总是在Silverlight 4 OOB应用程序中引发

And*_*vey 6 silverlight silverlight-4.0

我已经制作了一个相当复杂的Silverlight 4浏览器外应用程序.我的一个主视图模型为Application.Current.MainWindow.Closing事件添加了一个事件处理程序.这在最初运行应用程序时工作正常.它可以取消关闭操作.

但是,有时在执行显示和关闭ChildWindow等操作后,MainWindow的Closing事件不再调用我的处理程序.

在调试器中,我向MainWindow的底层结束事件委托添加了一个监视.在显示ChildWindow之前它不是null.然后有时在关闭ChildWindow后,委托为空.这就解释了为什么我的处理程序不再被调用.但为什么这个代表被搞砸了呢?为什么它偶尔会发生?我的应用程序不会在任何时候取消绑定我的事件处理程序.

这是我正在观看的代表:

System.Windows.Application.Current.MainWindow.m_closingEvent
Run Code Online (Sandbox Code Playgroud)

其他的东西:我正在使用Caliburn Micro

Tru*_*uss 8

我有同样的问题.我们有一个运行OOB的大型Silverlight应用程序.

出于某种原因,运行一段时间后m_ClosingEvent被清空了.我无法找到此问题的原因,但我认为这可能与我们更改根视觉或我们显示的所有子窗口有关.

我正在使用ApplicationWrapper类.

public class ApplicationWrapper : IApplicationWrapper
{
  public void Initialize()
  {
    HookCloseEvent(true);
  }
  private void HookCloseEvent(bool hook)
  {
    if (hook && IsRunningOutOfBrowser)
    {
      Application.Current.MainWindow.Closing += OnClosing;
    }
    else
    {
      if (IsRunningOutOfBrowser)
      {
        Application.Current.MainWindow.Closing -= OnClosing;
      }
    }
  }
  private void OnClosing(object sender, ClosingEventArgs e)
  {
    InvokeClosing(e);
  }

... etc.. 
}
Run Code Online (Sandbox Code Playgroud)

并且从未调用过InvokeClosing方法.但是当我改变它

public class ApplicationWrapper : IApplicationWrapper 
{
  private Window _mainWindow;

  public void Initialize()
  {
    if(IsRunningOutOfBrowser)
    {
      _mainWindow = Application.Current.MainWindow;
    }
    HookCloseEvent(true);
  }

  private void HookCloseEvent(bool hook)
  {
    if (hook && IsRunningOutOfBrowser)
    {
      _mainWindow.Closing += OnClosing;
    }
    else
    {
      if (IsRunningOutOfBrowser)
      {
        _mainWindow.Closing -= OnClosing;
      }
    }
  }

  private void OnClosing(object sender, ClosingEventArgs e)
  {
    InvokeClosing(e);
  }

... etc... 
}
Run Code Online (Sandbox Code Playgroud)

m_ClosingEvent没有空.

因此,尝试将"初始"MainWindow存储在一个字段中,并检查是否能解决您的问题.