2015-10-08 53 views
0

当试图创建WPF用户控件时,使用myWpfUserControl = new MyWpfUserControl();,WinForm背后的代码崩溃The calling thread must be STA, because many UI components require this.。它似乎在基础用户控件构造函数中崩溃。WPF用户控件崩溃'调用线程必须是STA'

我的应用程序的入口点是ApplicationStartupApp.xaml.cs,它有[STAThread]就可以了。我根本没有使用线程,并且我可以在Visual Studio的线程窗格中看到它在崩溃时位于Main Thread上。

编辑:它曾经工作。

这里是我的代码的骨架:

[STAThread] 
private void ApplicationStartup(object sender, StartupEventArgs e) 
{ 
    LogonFormEventListener listener = new LogonFormEventListener(); 
    Logon.LogonFormEvent += new Logon.ClassFormEventHandler(listener.TestEventRaised); 
    Logon logon = new Logon(); 
    logon.ShowDialog(); 
} 

public partial class Logon : Form 
{ 
    private void OKbutton_Click(object sender, EventArgs e) 
    { 
     if(LogonFormEvent !=null) LogonFormEvent(this, null); 
    } 
} 

public class LogonFormEventListener 
{ 
    public void TestEventRaised(Logon o, EventArgs e) 
    { 
     MainForm mainForm = new MainForm(); 
     mainForm.ShowDialog(); 
    } 
} 

public partial class MainForm : Form 
{ 
    MyWpfUserControl myWpfUserControl; 

    private void mainMenu_ItemClick(object sender, MenuBar.ItemEventArgs e) 
    { 
     switch (e.Item.Key) 
     { 
      case "myAction": 
       myWpfUserControl = new MyWpfUserControl(); //CRASH 
       ... 
       break; 
     } 
    } 
} 

中相应的基构造用户控制崩溃,之前的任何在我的用户控制运行的代码,所以是示出用户控制码没有点(我认为)。

任何想法,将不胜感激。

+0

您需要添加一些代码进行诊断。 –

+0

可能与[this](http://stackoverflow.com/questions/1361033/what-does-stathread-do)问题有关。 – Codor

+0

@Nikita什么代码会有帮助? – wezten

回答

0

只是一个猜测,但它可能可能在您的TestEventRaised的ShowDialog()?

 System.Windows.Application.Current.Dispatcher.Invoke((Action)(() => { mainForm.ShowDialog(); })); 

它可能因为某种原因而烧制。

如果不是,您可以尝试在[STAThread]函数之外的其他构造函数上对ShowDialog()调用进行包装,如果有的话。

+0

谢谢,但你以前的建议没有奏效。我不知道如何做后者。 – wezten

+0

我最后一部分的意思是,您的应用程序在您的问题中引用的之外是否有任何其他ShowDialog()调用?特别是在崩溃的类实例化中。 – Tyress

相关问题