OOB应用程序中引发

OOB应用程序中引发

本文介绍了MainWindow.Close事件并不总是在Silverlight 4 OOB应用程序中引发的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

限时删除!!

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

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

在调试器中,我向MainWindow的底层关闭事件委托添加了一个监视。在显示ChildWindow之前不为空。则有时在ChildWindow关闭后,委托为空。这就是为什么我的处理程序不再被调用的原因。但是,为什么这个代表被取消了呢?为什么这种情况只是偶尔发生呢?我的应用程序在任何时候都不会解除绑定我的事件处理程序。

这是我正在查看的委派:

System.Windows.Application.Current.MainWindow.m_closingEvent

其他内容:我正在使用卡利本Micro

推荐答案

我遇到了完全相同的问题。我们有一个运行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..
}

并且从未调用过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...
}

m_ClosingEvent未为空。

因此,尝试只将"初始"主窗口存储在一个字段中,并检查这是否解决了您的问题。

这篇关于MainWindow.Close事件并不总是在Silverlight 4 OOB应用程序中引发的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

1403页,肝出来的..

09-06 20:45