Открыть новое окно как STAThread
Я использую BackGroundWorker
получить доступ к некоторым данным и прочитать их. Но мне нужно открыть новое окно wpf внутри кода, который читает данные. (synchronous)
Когда я делаю это, я получаю ошибку.
Я пытался добавить [STAThread]
выше функций, которые открывают новое окно, но это не работает.
Метод, который открывает новое окно:
[STAThread]
int returnColumnStartSelection(string filePath)
{
ColumnStartSelection css = new ColumnStartSelection(filePath);
css.ShowDialog();
return css.lineStart;
}
Точка входа в новое окно:
public ColumnStartSelection(string filePath)
{
InitializeComponent();
//
this.Topmost = true;
this.WindowStartupLocation = WindowStartupLocation.CenterScreen;
}
2 ответа
Мое решение:
Я перестал пользоваться 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_DoWork, вы можете использовать Диспетчер, как указано в комментариях:
Application.Current.Dispatcher.Invoke((Action)delegate
{
EmailEnter emailer = new EmailEnter("Transfer", employee);
emailer.ShowDialog();
});
Это пример из моего рабочего кода. Переменная employee является локальной для фонового рабочего метода и отправляется конструктору EmailEnter в качестве параметра. Затем окно открывается с помощью.ShowDialog().
Я назвал это в конце моего метода BackgroundWorker_DoWork.
В вашем случае вы захотите заменить EmailEnter на ColumnStartSelection и передать ему переменную filePath.
Пожалуйста, дайте мне знать, если вы хотите, чтобы я что-то прояснил.