【问题标题】:WPF user control crashes with 'The calling thread must be STA'WPF 用户控件因“调用线程必须是 STA”而崩溃
【发布时间】:2016-01-05 22:36:00
【问题描述】:

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

我的应用程序的入口点是ApplicationStartup in App.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;
        }
    }
}

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

任何想法都将不胜感激。

【问题讨论】:

  • 你需要添加一些代码来诊断。
  • 可能与this问题有关。
  • @Nikita 什么代码会有帮助?
  • 添加你的类/用户控件和主方法。
  • 等等,您正在“WinForm”后面的代码中创建一个 WPF UserControl,并且启动位于 app.xaml.cs (WPF) 中?我对你使用什么技术以及你想要完成什么感到非常困惑。

标签: c# wpf winforms sta


【解决方案1】:

只是猜测,但它可能是 TestEventRaised 上的 ShowDialog()?

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

它可能由于某种原因而被触发。

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

【讨论】:

  • 谢谢,但您之前的建议无效。我不明白如何做后者。
  • 我对最后一部分的意思是,除了您在问题中引用的调用之外,您的应用是否还有其他 ShowDialog() 调用?特别是在它崩溃的类实例化中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多