我是一个WPF应用程序我在窗口的代码隐藏文件中有一个按钮单击的以下事件处理程序:
private void AddNewRecBtn_Click(object sender, RoutedEventArgs e)
{
DimRec.Visibility = System.Windows.Visibility.Visible;
PrBarLayer.Visibility = System.Windows.Visibility.Visible;
try
{
WriteAndClose();
}
catch (Exception)
{
throw;
}
}
这些代码行:
DimRec.Visibility = System.Windows.Visibility.Visible;
PrBarLayer.Visibility = System.Windows.Visibility.Visible;
只显示带有DimRec
的矩形Opacity="0.5" Fill="Gray"
,以便在显示ProgressBar时使窗口变暗,并使用ProgressBar本身显示StackPanel PrBarLayer
。
WriteAndClose();
方法执行很多东西,包括LINQ to SQL查询和屏幕上的大量可视化,这需要几秒钟(当它继续时,屏幕上没有发生,一切似乎都冻结了)。
在这几秒钟的时间里,我想向用户显示一个灰色的窗口控件和一个动画的进度条,但问题是这些代码可见的图层实际上并没有出现。如果我从此处理程序中删除WriteAndClose();
方法,一切正常 - ProgressBar可见。
似乎WPF不会立即呈现可视控件,然后资源被带到下一个方法 WriteAndClose
,所有内容都会冻结,然后在完成所有操作后屏幕呈现并且进度条层的可见性为坍塌了。
可能是什么解决方案?我怎样才能让ProgressBar先显示出来,然后再做重要的事情呢?
答案 0 :(得分:1)
您必须将WriteAndClose的执行移动到另一个线程。
但是,您只能使用[Control。] Dispatcher.BeginInvoke来操作UI。