Обновить интерфейс второго окна из MainWindow - PullRequest
0 голосов
/ 29 сентября 2018

Я объявил приватную переменную в классе MainWindow, чтобы я мог использовать ее позже:

private GraphicPresenterWindow _GraphicPresenterWindow;

В конструкторе MainWindow у меня есть следующая строка, открывающая новое окно:

_GraphicPresenterWindow = new GraphicPresenterWindow();
_GraphicPresenterWindow.Show();

Оба окна остаются открытыми одновременно.

Моя проблема в том, что я пытаюсь обновить Visibility для некоторых StackPanels и Text для TextBlocks из моего главного окна.

Вот код (для краткости я не опубликовал весь метод):

private void MainWindow_ShowFirstGraphBtn_Click(object sender, RoutedEventArgs e)
{
    // previous code omitted

    var CanShow = PresenterAPI.CanShowFirstGraph();
    if (CanShow)
    {
        _GraphicPresenterWindow.InitialGraphStack.Visibility = Visibility.Collapsed;
        _GraphicPresenterWindow.FirstGraphStack.Visibility = Visibility.Visible;
        _GraphicPresenterWindow.FirstGraphTxtBlock.Text = string.Format("{0} retrospective", _YearNo);
    }

    // following code omitted
}

Второе окно обновляется, но только когда все MainWindow_ShowFirstGraphBtn_Click метод выполнен.

Как заставить второе окно обновить значения при выполнении вызовов в этом методе?

Я также пытался использовать Dispatcher, но безрезультатно.

1 Ответ

0 голосов
/ 01 октября 2018

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

Причина этого заключается в том, что вы хотитевыполнить «тяжелую работу» (ваш метод MainWindow_ShowFirstGraphBtn_Click) в главном потоке.Пока ваш метод выполняется, WPF Dispatcher не может выполнить свою работу, он просто ожидает завершения вашего метода.Dispatcher отвечает за постановку в очередь так называемых диспетчерских операций, которые включают, например, привязку данных, рендеринг или обработку ввода.

Когда вы выполняете этот код в своем методе:

InitialGraphStack.Visibility = Visibility.Collapsed;

Вы фактически просто заявляете намерение , чтобы изменить видимость элемента.Для того чтобы это действительно произошло, WPF Dispatcher должен поставить в очередь и выполнить пару операций: обновление и отображение свойства зависимостей.Но это невозможно, пока ваш метод продолжается.Это объяснение того, почему вы видите изменения только когда ваш метод возвращается или в многопоточном решении (там Dispatcher может ставить в очередь операции независимо от вашего метода, который выполняется в рабочем потоке).

Теперь у вас есть два варианта:

  • Многопоточное решение (запустите ваш метод «усердного труда» в рабочем потоке).
  • Разделите ваш метод на части и позвольте Dispatcher Включение несколько раз, пока выполняется длительная обработка.В документации WPF Threading Model есть пример , как это сделать.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...