在Silverlight 3应用程序中强制重绘

时间:2009-10-14 11:10:23

标签: c# silverlight

我的Silverlight应用程序中有一个功能,需要一到两秒钟才能完成。在执行此功能时,我想向用户显示我的“正在加载”UC:

private void ComboBoxGranularity_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
  WaitScreenObject.Visibility = Visibility.Visible;

  OperationThatTakesALittleTime();

  WaitScreenObject.Visibility = Visibility.Collapsed;
}

问题是,Silverlight在执行函数时不会重绘,因此我的WaitScreen不会显示。我从this question尝试了这个技巧:

this.Visibility = Visibility.Visible;

但它不起作用。我想避免使用Backgroundworker-Overhead,那么是否有可能使WaitScreenObject可见?

提前致谢, 弗兰克

2 个答案:

答案 0 :(得分:2)

您的方法在UIThread上运行,因为您提到您没有使用后台线程。线程仅在不忙于其他内容时重新绘制屏幕,​​因为队列中充满了其他指令,这些被认为比重绘更重要。

我尝试了安德鲁建议的内容,但我在UIElement上找不到InvalidateVisual()方法。也许我只是愚蠢。

链接示例不适合您的原因是因为另一个问题只处理了一个因为没有焦点而无效的元素。但是,UIThread当时可用于刷新。

我还在委托上测试了dispatcher.BeginInvoke(),但它也没有用。我担心从我的角度来看,你可能只需要使用一个单独的线程。

我可能错了,因为我通过让线程睡眠来模拟我的“工作”,但是,我看不出它会有什么区别。

希望这有帮助。

答案 1 :(得分:1)

您是否尝试使根对象的视觉效果无效以试图说服它重绘? (但是没有检查它是否会起作用,只是想到了一个黑客)

编辑:InvaldiateVisual是UIelement上的WPF中的方法,在Silverlight中使用diff调用,例如InvalidateArrange

myCanvasRoot.InvalidateArrange();

有点hacky但可能会说服它执行屏幕更新。