打开新的 window 作为 STAThread

open new window as STAThread

我正在使用 BackGroundWorker 访问一些数据并读取它。但是我需要在读取数据的代码里面开辟一个新的wpfwindow。 (synchronous)

当我执行此操作时出现错误。

我尝试在打开新 window 的函数上方添加 [STAThread] 但这不起作用。

打开新方法window:

[STAThread]
int returnColumnStartSelection(string filePath)
{
    ColumnStartSelection css = new ColumnStartSelection(filePath);
    css.ShowDialog();
    return css.lineStart;
}

新 Window 的入口点:

public ColumnStartSelection(string filePath)
{
    InitializeComponent();
    //
    this.Topmost = true;
    this.WindowStartupLocation = WindowStartupLocation.CenterScreen;
}

希望我理解你的问题。如果没有,请随时纠正我。

要从 BackgroundWorker_DoWork 方法中打开一个新的 window,您可以使用评论中提到的 Dispatcher:

Application.Current.Dispatcher.Invoke((Action)delegate
        {
            EmailEnter emailer = new EmailEnter("Transfer", employee);
            emailer.ShowDialog();
        });

这是我的一些工作代码中的示例。 employee 变量是后台工作程序方法的本地变量,并作为参数发送到 EmailEnter 构造函数。然后使用 .ShowDialog() 打开 window。

我在 BackgroundWorker_DoWork 方法的末尾调用了它。

在您的情况下,您可能希望将 EmailEnter 替换为 ColumnStartSelection 并将您的 filePath 变量传递给它。

如果你想让我澄清任何事情,请告诉我。

我的解决方案:

我停止使用 BackgroundWorker 并开始使用 aysncawait。 对于我的 STAThread 问题,我构建了一个创建新 STAThread 的新方法,而另一个线程只是等待值更改。

string selectTable(myDataTable dt)
{
    string column = null;
    Thread thread = new Thread(() =>
    {
        TableSelection ts = new TableSelection(dt);
        ts.ShowDialog();
        column = ts.column;
    });
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();

    while (column == null)
    {
        Thread.Sleep(50);
    }
    try { thread.Abort(); } catch { }

    return column;
}