如果我使用Application.LoadComponent()
加载UserControl,Page或Window,我的应用程序会在尝试关闭时冻结。
该应用程序显然已关闭,但该过程仍在运行。调试时很容易注意到。
我在Windows 7 64位和Vista 32位下测试过它。在这两种情况下,我都使用了VS2008和.NET 3.5。
可以通过创建wpf应用程序来构建repro,如下所示:
public partial class Window1 : Window {
public Window1() {
InitializeComponent();
}
public void LoadCopy() {
var uri = new Uri("/WpfApplication1;component/window1.xaml", UriKind.Relative);
var copy = (Window)Application.LoadComponent(uri);
MessageBox.Show(copy.Title);
}
private void Button_Click(object sender, EventArgs e) {
LoadCopy();
}
}
有谁知道可能会发生什么?以及如何解决?
答案 0 :(得分:1)
尝试将所有者分配给创建的程序集,即
copy.Owner = this;
这样做后我就能关闭你的例子了。
答案 1 :(得分:1)
我认为这是因为你在你的主窗口(http://msdn.microsoft.com/en-us/library/system.windows.application.mainwindow.aspx)上调用LoadComponent(),即你的案例Window1中的启动uri。当你关闭它时,程序可能会进入一些循环,因为默认情况下关闭一个主窗口会关闭应用程序,而你的两个Window1实例正在等待彼此(A.K.A.一个死锁)!虽然看起来只是在使应用程序不可见之后(所以它似乎已经关闭)。
如果您仍然必须在Window1上使用LoadComponent(),我认为您不需要通过更改应用程序的StartupUri来使其成为您的启动uri:
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Window1.xaml"> <!-- change this -->
</Application>
或者将Application.ShutdownMode(http://msdn.microsoft.com/en-us/library/system.windows.application.shutdownmode.aspx)更改为OnLastWindowClose:
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Window1.xaml"
ShutdownMode="OnLastWindowClose">
</Application>
答案 2 :(得分:0)
我已经在.Net 4.0和3.5下的Windows 7 32位上构建了应用程序。 我工作得很好。我认为你的问题是配置特定的。 你有哪些配置?您是否引用除默认WPF项目引用之外的任何程序集?