2011-03-23 67 views
0

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

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> 

这是否与调度程序不让它更新?

任何人曾经做过这样的事情?有什么建议?

谢谢!

回答

0

我的猜测是Dispatcher线程忙于尝试呈现您的控件并且无法更新ProgressBar。

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

+0

呀 - 你是对的,我把一个按钮放在那里,你不能点击它......任何人都有任何想法,我怎么能让一些东西让用户知道发生了什么?就像动画或任何会保持响应的东西。我曾尝试过使用后台工作人员等...... – Kenn 2011-03-24 13:11:25

+0

我能想到的唯一事情就是尝试将用户控件的创建分解成更小的部分,然后以低优先级分派每个部分。这将希望允许调度员在两者之间执行一些更高优先级的任务,即更新进度条。有人对调度程序的调度方式有了更多的了解,可能会说出这是否正确 – Scott 2011-03-24 23:59:36

0

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

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(); 

希望这是有用的人......总的想法是在不同的线程创建视图模型的原因是,将采取永远载入等等的东西......