繁体   English   中英

WPF用户控件崩溃,显示“调用线程必须是STA”

[英]WPF user control crashes with 'The calling thread must be STA'

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

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

任何想法,将不胜感激。

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

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

它可能由于某种原因而被解雇。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM