此刻,我正在尝试调试一些我希望检查项目可见性的代码(例如,使用.IsVisible()
方法)。问题是,当我从一个断点跳到下一个断点或在行之间跳转时,数据显然发生了变化,但是程序的UI似乎根本没有变化。这使我很难判断事物是否可见,而且我必须信任Visual Studio。
是否有一种方法可以在调试时更新UI,以便在那里也能看到更改?
答案 0 :(得分:2)
您必须强制对UI进行同步重新渲染。您可以在某处定义此扩展方法:
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
上调用它(使用立即窗口,断点操作,其他代码行等)。它应该同步重新渲染有问题的Window
:
this.SynchronouslyRedraw(); // assuming your breakpoint is in your `Window` class for example.
请注意,此方法适用于UIElement
对象的可视树中的任何Window
。
答案 1 :(得分:0)
只有在有机会的情况下,UI才会更新-这意味着不占用其他工作(例如事件处理程序)的UI线程。
在WPF中的调试器中没有简单的方法可以做到这一点。在Windows窗体中,您只能使用Application.DoEvents();
,但是WPF要求您使用await Dispatcher.Yield();
,因此不能随便执行它。两者都以几乎相同的方式解决相同的问题-它们使消息循环有机会处理所有待处理的消息,然后返回到上次中断的地方。两者也都具有相同的弱点-它们会带来重新进入的机会,所以要小心。