Application.LoadComponent使应用程序在关闭时冻结

时间:2010-10-13 14:15:26

标签: wpf visual-studio-2008 .net-3.5

如果我使用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();
        }
    }

有谁知道可能会发生什么?以及如何解决?

3 个答案:

答案 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项目引用之外的任何程序集?