代码之家  ›  专栏  ›  技术社区  ›  Andrew Davey

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

  •  6
  • Andrew Davey  · 技术社区  · 16 年前

    我制作了一个相当复杂的Silverlight4浏览器外应用程序。我的一个主视图模型向application.current.mainwindow.closing事件添加了一个事件处理程序。 当应用程序最初运行时,这会很好地工作。可以取消关闭操作。

    然而, 有时 在执行显示和关闭子窗口等操作后,主窗口的关闭事件不再调用我的处理程序。

    在调试器中,我向主窗口的底层关闭事件委托添加了一个监视。在显示ChildWindow之前不为空。然后 有时 关闭ChildWindow后,委托为空。这解释了为什么不再调用我的处理程序。但为什么这个代表会被忽略呢?为什么只是偶尔发生? 我的应用程序没有在任何时候解除绑定我的事件处理程序。

    这是我正在观看的代表:

    System.Windows.Application.Current.MainWindow.m_closingEvent
    

    其他:我用的是Caliburn Micro

    3 回复  |  直到 15 年前
        1
  •  8
  •   Truls Clauss    16 年前

    我也有同样的问题。我们有一个运行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没有空。

    所以,尝试将“初始”主窗口存储在一个字段中,并检查这是否解决了您的问题。

        2
  •  3
  •   Jeremy Likness    16 年前

    为什么不注册一个服务而不是挂接到事件上呢?创建实现IApplicationService和IApplicationLifeTimeAware的类。后者为您提供“Onexiting”和“Onexited”两个事件。通过将服务指向app.xaml中名为的部分,可以将服务放置在应用程序中。我已经在许多项目中使用了这个方法,并且从未遇到过不被调用的现有方法的问题。

        3
  •  1
  •   Rodney    15 年前

    好吧,在拔出我的头发和许多错误的开始之后 I finally found the answer -这似乎是一个已知的错误,关闭事件,OOB和ChildWindows打开/关闭…

    技巧是存储对主窗口的静态引用:

    public MainPage()
    {
        InitializeComponent();
        Loaded += MainPage_Loaded;
    }
    
    private void MainPage_Loaded(object sender, System.Windows.RoutedEventArgs e)
    {
        //you have to store this to work around the bug
        //http://forums.silverlight.net/forums/p/185664/424174.aspx
        _mainWindow = App.GetApp.MainWindow;
    
        App.GetApp.MainWindow.Closing += (s, e1) =>
        {
            if (UIUtilities.ShowMessage("Would you like to exit AMT Mobile?", "Exit Application", MessageBoxButton.OKCancel) != MessageBoxResult.OK)
            {
                e1.Cancel = true;
            }
        };
    }
    
    推荐文章