本文介绍了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应用程序中引发的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!