открыть новое окно как STAThread - PullRequest
0 голосов
/ 08 июня 2018

Я использую 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 ]

0 голосов
/ 27 июня 2018

Мое решение:

Я перестал использовать 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;
}
0 голосов
/ 26 июня 2018

Надеюсь, я понимаю ваш вопрос.Если нет, не стесняйтесь поправлять меня.

Чтобы открыть новое окно из метода BackgroundWorker_DoWork, вы можете использовать Диспетчер, как указано в комментариях:

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

Это пример из моего рабочего кода.Переменная employee является локальной для фонового рабочего метода и отправляется конструктору EmailEnter в качестве параметра.Затем окно открывается с помощью .ShowDialog ().

Я назвал это в конце моего метода BackgroundWorker_DoWork.

В вашем случае вы захотите заменить EmailEnter на ColumnStartSelection и передать свой filePathпеременная к нему.

Пожалуйста, дайте мне знать, если вы хотите, чтобы я что-то прояснил.

...