2010-01-19 227 views
1

我一个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;  

只是使人们看到一个长方形DimRecOpacity="0.5" Fill="Gray"用于显示与进度本身进度和一个StackPanel PrBarLayer期间调光窗口。 WriteAndClose();方法执行很多东西,包括LINQ to SQL查询和屏幕上的大量可视化,这需要几秒钟的时间(当它发生时,屏幕上没有发生什么,一切似乎都冻结了)。

在几秒钟的这段时间里,我想向用户展示一个暗淡的窗口控件和一个进度条动画,但问题是这些代码可见的图层实际上并未出现。如果我从这个处理程序中删除WriteAndClose();方法,一切正常 - ProgressBar变得可见。

似乎WPF并没有立刻渲染视觉控件,然后资源被带到下一个方法WriteAndClose,一切都冻结了,然后当已经完成了所有的屏幕渲染并且进度条图层的可见性被设置为Collapsed。

什么是解决方案?我如何才能让ProgressBar展示第一,然后才能完成剩余的重任?

回答

1

您将不得不将WriteAndClose的执行移动到另一个线程。

但是,您将只能使用[Control。] Dispatcher.BeginInvoke操作UI。