Как изменить текущее отображаемое окно из другого потока?WPF - PullRequest
0 голосов
/ 02 июля 2019

У меня есть клиент-серверное приложение (Trivia Game).

Моя проблема: Когда клиенты находятся в "waitRoom", программа запускает отдельный поток, который каждую секунду запрашивает у сервера состояние игры (чтобы увидеть, присоединился ли другой клиент, чтобы увидеть, началась ли игра или закрыл ли администратор комнату). ).

В моем случае, когда администратор закрывает комнату, все клиенты должны вернуться к экрану меню. Отдельный поток получает сообщение, которое говорит ему закрыть комнату, и теперь поток должен изменить текущее отображаемое окно.

Я пытался использовать Dispatcher.Invoke, но безуспешно:

public void returnToMenuScreen()
{
    Dispatcher.Invoke(() =>
    {
        this.Visibility = Visibility.Hidden;
        this.IsEnabled = false;

        Menu newScreen = new Menu(Globals.SOCKET, Globals.USER);
        newScreen.Show();
    });
}

Globals.SOCKET: (Розетка) Globals.USER: (строка)

РЕДАКТИРОВАТЬ: Этот код не работает, и я получаю сообщение об ошибке, что другой поток (основной) владеет свойством.

2-е РЕДАКТИРОВАНИЕ:

public void displayPlayers(string players)
{
    //spliting all the names.
    string[] names = players.Split(", ".ToCharArray());

    //Removing The un-updated list.
    playersListBox.Dispatcher.Invoke(new Action(() => playersListBox.Items.Clear()));

    //Displaying the names.
    foreach (string name in names)
        if (!String.IsNullOrEmpty(name))
            playersListBox.Dispatcher.Invoke(new Action(() => playersListBox.Items.Add(name)));
}

этот код работает, я изменяю элементы в отображаемом в данный момент списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...