Есть ли способ увидеть обновления пользовательского интерфейса при отладке? - PullRequest
4 голосов
/ 17 января 2020

В данный момент я пытаюсь отладить некоторый код, в котором проверяю видимость элементов (например, методом .IsVisible()). Проблема в том, что когда я прыгаю с одной точки останова на другую или прыгаю между строк, данные, очевидно, меняются, но пользовательский интерфейс программы, похоже, совсем не меняется. Из-за этого мне сложно сказать, видны ли вещи, и я должен доверять Visual Studio.

Есть ли способ сделать обновление пользовательского интерфейса во время отладки, чтобы я также мог видеть изменения там?

Ответы [ 2 ]

2 голосов
/ 17 января 2020

Вы должны принудительно выполнить повторную визуализацию интерфейса. Вы можете определить этот метод расширения где-нибудь:

public static void SynchronouslyRedraw(this UIElement uiElement) {
    uiElement.InvalidateVisual();
    Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(() => { })).Wait();
    Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => { })).Wait();
}

и вызывать его на своем Window после каждой точки останова (используя непосредственное окно, действие точки останова, дополнительную строку кода и т. Д. c). Он должен синхронно перерисовать Window в вопросе:

this.SynchronouslyRedraw(); // assuming your breakpoint is in your `Window` class for example.

Обратите внимание, что этот метод работает с любым UIElement, который находится в визуальном дереве объекта Window.

0 голосов
/ 17 января 2020

Пользовательский интерфейс обновляется только тогда, когда вы предоставляете ему возможность - это означает, что вы не должны занимать поток пользовательского интерфейса другой работой (такой как ваш обработчик событий).

Нет простого способа сделать это в отладчик в WPF. В Windows формах вы можете просто использовать Application.DoEvents();, но WPF требует от вас await Dispatcher.Yield();, поэтому вы не можете просто выполнить его, когда захотите. Оба решают одну и ту же проблему во многом одинаково - они дают сообщению l oop возможность обработать все ожидающие сообщения, а затем go обратно туда, где вы остановились. Оба также имеют одну и ту же слабость - они предоставляют возможность для повторного входа, поэтому будьте осторожны.

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