2010-10-13 114 views
3

如果我使用Application.LoadComponent()加载UserControl,Page或Window,当我尝试关闭它时,我的应用程序会冻结。Application.LoadComponent使应用程序冻结关闭

该应用程序显然关闭,但该过程继续运行。调试时易于注意。

我已经在Windows 7 64bit和Vista 32bit下测试了它。在这两种情况下,我都使用VS2008和.NET 3.5。

重现bug可以通过创建一个WPF应用程序如下建:


    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(); 
     } 
    } 

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

回答

1

尝试分配所有者创建的组件,即

copy.Owner = this; 

我能这样做后,关闭您的例子。

+0

完美!可能这将避免从应用程序的孩子中删除窗口提到的循环Mrk Mnl。只是一个猜测。你能评论你是如何找到这个解决方案的? – 2010-10-19 12:48:58

+0

当我将Win Form应用程序转换为WPF时,遇到了类似的问题。我使用CenterOwner为窗口状态创建的窗口行为不正确。在我将创建的应用程序添加为所有者后,它负责处理它。 – 2010-10-19 21:32:06

0

我已经建立你的应用程序在Windows 7 32位下。NET 4.0和3.5。 我对我工作得很好。我认为你的问题是配置特定的。 你有哪些配置?除了默认的WPF项目引用,你是否引用了任何程序集?

+0

我发布的代码重现了Windows 7 64位和Vista 32位的错误,这两种情况在.NET 3.5和VS2008下。 – 2010-10-18 19:48:37

1

我认为这是因为您在您的主窗口(http://msdn.microsoft.com/en-us/library/system.windows.application.mainwindow.aspx)上调用了LoadComponent(),也就是您的情况Window1中的启动uri。程序可能在关闭它时进入一些循环,因为默认情况下关闭主窗口会关闭应用程序,并且您的两个Window1实例正在彼此等待(A.K.A.死锁)!虽然看起来只是在将应用程序隐形后(因此它似乎已关闭)。

如果仍然必须在窗口1使用使用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> 
+0

很好的答案。大概解释发生了什么,但是你的解决方案对我来说都是不可能的。不管怎么说,还是要谢谢你。 – 2010-10-19 12:46:43

+0

嗯..我想我可能是错的..(这只是一个猜测)..如果复制的窗口不是由您的应用程序(我认为它是)自动拥有的或任何窗口,那么这将解释为什么程序持续在所有其他事情都关闭后(尽管我会认为未关闭的窗口仍然可见)... – markmnl 2010-10-19 14:44:03