打开新的 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
并开始使用 aysnc
和 await
。
对于我的 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;
}
我正在使用 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
并开始使用 aysnc
和 await
。
对于我的 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;
}