使用调度程序在WPF中加载用户控件

时间:2011-03-23 20:49:27

标签: c# wpf xaml

我有一个用户控件,其中包含一个包含2900个项目的网格,对于这个原因我无能为力,这就是业务需要的方式......显然加载/渲染速度很慢所以我创建了这个技巧使用调度程序,在处理事件的视图模型中(棱镜事件......不是标准的Windows事件)。

 public void ShowPopUp(Type viewType)
{
  var waitScreen = new Controls.Views.SampleView();
  var popUp = new ShellBlank();
  popUp.Content = waitScreen;
  popUp.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen;
  popUp.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background, new Action(delegate() { 
    popUp.Content = container.Resolve(viewType);})
  );
  popUp.ShowDialog();
}

它的工作原理很好但是在我的SampleView上(因为它现在被调用)有一个决定性的进度条,但它永远不会更新,就像你知道的那样 - 绿色巴拉会回来和第四个......这是XAML吧。

 <Border>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Label Margin="12" FontSize="16" Foreground="WhiteSmoke" Content="Loading... Please wait"/>
        <ProgressBar Grid.Row="1" IsIndeterminate="True"  Width="280" Height="24"/>
    </Grid>
</Border>

是否与调度员没有让它更新有关?

有人做过这样的事吗?有什么建议吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

我的猜测是Dispatcher线程正忙着尝试渲染你的控件而无法更新ProgressBar。

弹出窗口是否响应?尝试移动窗口或添加按钮,看看是否可以单击按钮。这可能有助于确定进度条或调度程序是否过于繁忙是一个简单的问题。

答案 1 :(得分:0)

实际上我最后在视图上调用了container.resolve,我在视图模型上调用了container.resolve,这可以通过标准的后台工作者来完成 - 然后在RunWorkerCompleted中,在主线程上发生bank创建我们在后台愉快地等待的视图模型中传递的视图,并切换出等待屏幕,当然这不会受到我们长时间运行的进程的影响。这是代码。

 AddVendorModalityViewModel viewModel;
    var waitScreen = new Controls.Views.SampleView();
    var popUp = new ShellBlank();
    popUp.Content = waitScreen;
    popUp.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen;

    var bw = new BackgroundWorker() { WorkerReportsProgress = true, WorkerSupportsCancellation = true };
    bw.DoWork += (s, e) =>
    {
      viewModel = container.Resolve<AddVendorModalityViewModel>();
      e.Result = viewModel;
    };
    bw.RunWorkerCompleted += (s, e) =>
    {
      viewModel = (AddVendorModalityViewModel)e.Result;
      AddVendorModalityView view = new AddVendorModalityView(viewModel);
      popUp.Content = view;
    };
    bw.RunWorkerAsync();
    popUp.ShowDialog();

希望这对某些人有用...一般的想法是在不同的线程上创建ViewModel,因为它是需要永远加载的东西......