WPF用户控件崩溃'调用线程必须是STA'

本文关键字:STA 线程 调用 控件 用户 WPF 崩溃 | 更新日期: 2023-09-27 18:16:55

WinForm背后的代码是崩溃与The calling thread must be STA, because many UI components require this.,当试图创建一个WPF用户控件,使用myWpfUserControl = new MyWpfUserControl();。在基本用户控件构造函数中似乎崩溃了。

我的应用程序的入口点是App.xaml.cs中的ApplicationStartup,上面有[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;
        }
    }
}

用户控件在基本构造函数中崩溃,在我的用户控件中的任何代码运行之前,所以没有必要显示用户控件代码(我认为)。

WPF用户控件崩溃'调用线程必须是STA'

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

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

可能是什么原因导致的。

如果没有,您可以尝试将它封装在[STAThread]函数之外的其他构造函数的ShowDialog()调用中,如果其中一些构造函数这样做的话。