我在 Jeff Prosise 的博客文章的帮助下找到了一个解决方案:http: //www.wintellect.com/cs/blogs/jprosise/archive/2008/10/25/cool-silverlight-trick-5.aspx
这个想法是延迟执行长时间运行任务的调用,直到触发 Silverlight UI 呈现事件。为此,我使用了该CompositionTarget.Rendering
事件。我在用户控件的构造函数中订阅了它:
CompositionTarget.Rendering += this.CompositionTargetRendering;
更新控件的文本后,TextBlock
我设置了一个私有标志,这表明应该在事件处理程序中进行一些处理:
StatusTextBlock.Text = "Performing Some Operation...";
this.processRenderingEvent = true;
这是处理程序的代码:
private void CompositionTargetRendering(Object sender, EventArgs e)
{
if (this.processRenderingEvent)
{
if (++this.renderingEventCounter == 2)
{
System.Threading.Thread.Sleep(4000); // Example of long running task
this.processRenderingEvent = false;
}
}
}
这里要提到的重要一点是,我renderingEventCounter
不是第一次触发事件,而是第二次使用私有整数字段来开始长时间运行的任务。原因是CompositionTarget.Rendering
事件在 Silverlight UI 呈现引擎在应用程序的显示表面上绘制新帧之前触发,这意味着在第一次触发事件时,TextBlock
控件的文本尚未更新。不过会第二次更新。