繁体   English   中英

RadBusyIndi​​cator未从ViewModel显示PRISM / MEF / WPF

[英]RadBusyIndicator not showing PRISM/MEF/WPF from ViewModel

我在WPF应用程序中使用MVVM / PRISM / MEF。 它具有一个包含多个记录的DataGrid,并且双击一行时,将单独的视图添加到具有多个控件的区域中,新屏幕的控件初始化大约需要10秒钟,因此这就是为什么我要在此期间显示RadBusyIndi​​cator时间。

在XAML中关注

<!-- This is Main View -->
<!-- Module: MainModule, ViewModel: MainViewViewModel -->
<telerik:RadBusyIndicator IsBusy="{Binding IsBusy}" BusyContent="{Binding BusyContent}">
<!-- All PRISM regions are here -->
</telerik:RadBusyIndicator>

它的视图模型是

class MainViewViewModel : ViewModelBase
    {
        ImportingConstructor]
        public MainViewViewModel(IEventAggregator eventAggregator, IRegionManager regionManager, IServiceLocator serviceLocator)
            :base(eventAggregator, regionManager, serviceLocator)
        {
            eventAggregator.GetEvent<BusyStateChangedEvent>().Subscribe(OnBusyStateChanged,ThreadOption.BackgroundThread);
        }

        #region BusyStateChanged

        private void OnBusyStateChanged(bool newState)
        {
            IsBusy = newState;
        }

        #endregion
}

而在其他视图中,当双击DataGrid行时,将调用ViewModelBase函数,如下所示

public class ViewModelBase
{
        private NavigationItem global_navItem = null;

        public virtual void OnNavigationItemChanged(NavigationItem item)
        {
            changeNav = true;
            global_navItem = item;

            //Firing event to change the state
            EventAggregator.GetEvent<BusyStateChangedEvent>().Publish(true);

            //Using BackgroundWorker, but its not showing any Busy Indicator as well
            var bw = new BackgroundWorker();
            bw.DoWork += bw_DoWork;
            bw.RunWorkerCompleted += bw_RunWorkerCompleted;

            bw.RunWorkerAsync();
        }

        void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //Setting busy indicator to false
            EventAggregator.GetEvent<BusyStateChangedEvent>().Publish(false);
        }

        void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            //DisplayView function is taking too long
            if (global_navItem != null) this.DisplayView(global_navItem);
        }
}

public void DisplayView(NavigationItem item)
        {
                    try
                    {
                        //This call is taking long as it initializes the View
                        MyCustomeUserControl view = this.ServiceLocator.GetInstance<MyCustomeUserControl>(item.viewName);

                        view.Region = this.Region;
                    }catch(Exception e)
                    {
                    }                   
        }

事件被正确触发并且视图正确显示,但是我的问题是“忙”指示器根本没有显示,当我双击DataGrid行时,GUI变得无响应,并在一段时间后出现了新视图。 我怀疑这是GUI线程繁忙的问题,但是我应该怎么做才能避免这种情况,因为我已经使用过BackgroudWorker

编辑

1-我正在为IsBusy Property引发PropertyChanged事件。 并且我已经尝试了事件订阅中Thread的所有选项。 Thread.BackgroundThreadThread.UIThreadThread.PublisherThread 但没有变化。

2-我已经测试了Thread.Sleep而不是bw_DoWork中的DisplayView ,并且正确显示了RadBusyIndicator ,所以这意味着无论我是否为它创建了BackgroundWorker ,都正在GUI线程中初始化GUI控件。

如果使用Thread.Sleep(5000)而不是this.DisplayView(global_navItem) Thread.Sleep(5000) ,指示符会出现吗?

我假设显示视图将使用UI线程,无论您是否使用BackgroundWorker ,这都会阻塞UI。

编辑:

似乎您的UI加载操作阻塞了UI线程,因此您的BusyIndi​​cator可以尝试将其中一个托管在其他线程中。 本文介绍了一种方法。

终于我找到了解决方案。 作为参考,可以看到以下帖子。 我已经使用本文讨论的方法使用RadBusyIndi​​cator实现了一个无铬子窗口。

在WPF中创建多个UI线程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM