0

当使用 Entity Framework 从数据库加载数据需要很长时间时,我想在 UI (WPF) 上显示“加载”指示器。对于指标本身,我使用WPF 加载等待装饰器,如文章所示。

该指示器工作正常,但在实体框架加载数据时未显示。在这种情况下,指示器根本不会显示在 UI 上。

我运行这个:

'show Adorner (loading indicator)
LoadingAdorner.IsAdornerVisible = Not LoadingAdorner.IsAdornerVisible

'read data from database with Entity Framework
Persons = _context.persons

'hide Adorner (loading indicator) after loading data is completed
LoadingAdorner.IsAdornerVisible = Not LoadingAdorner.IsAdornerVisible

<ac:AdornedControl Name="LoadingAdorner">
        <ac:AdornedControl.AdornerContent>
            <local:LoadingWait></local:LoadingWait>
        </ac:AdornedControl.AdornerContent>
        <ListBox>
            ...code not shown
        </ListBox>  
</ac:AdornedControl>  

只有在加载数据后,指示器才可见。我缺少什么以及如何在加载数据时显示指示器?

4

1 回答 1

2

问题是您正在主线程中运行 EF 调用。这会阻止 UI 更新,直到您从数据库接收到所有数据。
要解决此问题,只需添加BackgroundWorker或异步方法:

  var worker = new BackgroundWorker();
  worker.DoWork += (s, e) => {
       this.IsLoading = true;
       this.Persons = _context.persons;
    };        
    worker.RunWorkerCompleted += (s, e) => {
       this.IsLoading = false;
    };

重要提示:记住跨线程访问(DoWork在后台线程中执行,已完成- UI 线程)

最后,要开始/触发DoWork,您需要.RunWorkerAsync()在您的工作人员上执行。

于 2013-10-29T14:43:53.280 回答