2012-04-24 196 views
2

我尝试在我的c#测试应用程序中打开一个wpf窗口。 但是当我打开窗户时,它会立即关闭。WPF/C# - 窗口在打开时关闭

我的代码有什么问题?

Main.cs(也可here):

namespace Project1 
{ 
    class TestClass 
    { 
     public static MainWindow _mainWindow = null; 

     static void Main(string[] args) 
     { 
      Thread t = new Thread(new ThreadStart(ThreadProc)); 
      t.SetApartmentState(ApartmentState.STA); 
      t.Start(); 

      while (true) 
      { 
       System.Threading.Thread.Sleep(1000); 
       _mainWindow.ToString(); 
      } 
     } 

     public static void ThreadProc() 
     { 
      TestClass2 testClass = new TestClass2(); 
      testClass.Open(); 
     } 
    } 

    class TestClass2 
    { 
     public void Open() 
     { 
      TestClass._mainWindow = new MainWindow(); 
      TestClass._mainWindow.Show(); 
      Console.WriteLine("=)"); 
     } 
    } 
} 

MainWindow.xaml:

http://paste.ubuntu.com/943800/

回答

7

您的代码做一些奇怪的事情它没有明显的原因:

  • 为什么要创建一个新的线程,然后把你已经进入一个无限循环的一个?
  • 为什么电话.ToString()在您的Window,另外由另一个线程拥有? (我不确定这会不会像大多数其他操作一样会因为所有权问题而导致程序崩溃,但很可能)。

此外,您不会在任何地方创建消息循环,所以即使程序运行,它也完全不响应用户输入。创建Window,在你做任何线索之后,你应该叫

System.Windows.Threading.Dispatcher.Run(); 
+0

谢谢,System.Windows.Threading.Dispatcher.Run();有助于保持窗户的开放。 我正在使用线程,因为代码抛出InvalidOperationException“调用线程必须是STA,因为许多UI组件都需要这个。” – David 2012-04-24 09:35:19

+1

你的Main方法中的[STAThread]属性将处理该异常,并且不需要使用另一个线程并调用'System.Windows.Threading.Dispatcher.Run();' – Tsabo 2012-04-24 09:39:35

0

你尝试使用ShowDialog(),而不是Show()

+0

缺少[STAThread]属性为什么你认为是有帮助的?? !! – AymenDaoudi 2014-11-25 11:30:55

2

我相信你在你的Main()