Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RadBusyIndicator不显示ViewModel中的PRISM/MEF/WPF_Wpf_Mvvm_Prism_Backgroundworker_Busyindicator - Fatal编程技术网

RadBusyIndicator不显示ViewModel中的PRISM/MEF/WPF

RadBusyIndicator不显示ViewModel中的PRISM/MEF/WPF,wpf,mvvm,prism,backgroundworker,busyindicator,Wpf,Mvvm,Prism,Backgroundworker,Busyindicator,我正在为我的WPF应用程序使用MVVM/PRISM/MEF。它有一个带有多条记录的DataGrid,当双击一行时,一个单独的视图被添加到带有多个控件的区域中,新屏幕的控件初始化大约需要10秒,因此我想在此期间显示RadBusyIndicator 在XAML中跟踪 它的视图模型是 class MainViewModel:ViewModelBase { 导入构造函数] public Main ViewModel(IEventAggregator事件聚合器、IRegionManager regio

我正在为我的WPF应用程序使用MVVM/PRISM/MEF。它有一个带有多条记录的DataGrid,当双击一行时,一个单独的视图被添加到带有多个控件的区域中,新屏幕的控件初始化大约需要10秒,因此我想在此期间显示RadBusyIndicator

在XAML中跟踪


它的视图模型是

class MainViewModel:ViewModelBase
{
导入构造函数]
public Main ViewModel(IEventAggregator事件聚合器、IRegionManager regionManager、iSeries Vicelocator serviceLocator)
:base(eventAggregator、regionManager、serviceLocator)
{
eventAggregator.GetEvent().Subscribe(OnBusyStateChanged,ThreadOption.BackgroundThread);
}
#区域总线状态已更改
私有无效OnBusyState已更改(bool newState)
{
IsBusy=newState;
}
#端区
}
在另一个视图中,双击DataGrid行时调用ViewModelBase函数,如下所示

公共类ViewModelBase
{
私有导航项全局_navItem=null;
OnNavigationItemChanged上的公共虚拟无效(NavigationItem)
{
changeNav=true;
全局_navItem=项目;
//触发事件以更改状态
EventAggregator.GetEvent().Publish(true);
//使用BackgroundWorker,但它也不显示任何忙指示器
var bw=新的BackgroundWorker();
bw.DoWork+=bw_DoWork;
bw.RunWorkerCompleted+=bw_RunWorkerCompleted;
RunWorkerAsync();
}
void bw_RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e)
{
//将忙指示灯设置为false
EventAggregator.GetEvent().Publish(false);
}
void bw_DoWork(对象发送方,DoWorkEventArgs e)
{
//DisplayView功能花费的时间太长
如果(全局_navItem!=null)此.DisplayView(全局_navItem);
}
}
公共void显示视图(NavigationItem项目)
{
尝试
{
//此调用需要很长时间来初始化视图
MyCustomeUserControl视图=this.ServiceLocator.GetInstance(item.viewName);
view.Region=this.Region;
}捕获(例外e)
{
}                   
}
事件被正确触发,视图显示正确,但我的问题是,Busy指示器根本不显示,当我双击DataGrid行时,GUI变得无响应,一段时间后,新视图出现。我怀疑这是GUI线程忙的问题,但我能做些什么来避免这个问题,我已经使用了
backgroundworker

编辑

1-我正在为IsBusy属性引发PropertyChanged事件。我已经尝试了事件订阅中线程的所有选项。i、 e.
Thread.BackgroundThread
Thread.UIThread
Thread.PublisherThread
。但是没有变化


2-我已经测试了
线程。Sleep
而不是
bw\u-DoWork
中的
DisplayView
,并且它正确地显示了
RadBusyIndicator
,因此这意味着GUI控件正在GUI线程中初始化,无论我是否为它创建了一个
BackgroundWorker

如果您使用
Thread.Sleep(5000)
而不是
this.DisplayView(global_navItem)
,指示器是否会出现

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

编辑:


由于您的UI加载操作似乎会阻塞UI线程,因此您的BusyIndicator可以尝试将其中一个托管在不同的线程中。在中解释了一种方法。

最后,我找到了一个解决方案。以下文章可供参考。我使用本文讨论的方法实现了一个带有RadBusyIndicator的无chrome子窗口


您发布的代码似乎没有问题。只是一个愚蠢的问题(我没有恶意)你是否为IsBusy属性引发PropertyChanged事件?我只是想问一下。。。还有一件事。。。它说,如果您需要能够在收到事件时更新用户界面元素,请在用户界面线程上订阅以接收事件。所以,如果我是你,我会用ThreadOption.UIThread在订阅BusyStateChangedEvent时切换ThreadOption.BackgroundThread。但这些只是想法…谢谢@ViktorLaCroix,是的,我正在为
IsBusy
属性发起PropertyChanged事件。我已经尝试了事件订阅中线程的所有选项。i、 e.
Thread.BackgroundThread
Thread.UIThread
Thread.PublisherThread
。但是没有改变。现在它变得有趣:)那么你能用这些额外的信息编辑你的问题吗?请不要忘记,当您使用线程切换DoWork方法的主体时,一切都正常。我尝试的最后一件事是在后台创建视图的实例,然后将其作为DoWork的结果传递,并将其添加到WorkerCompleted方法中的区域。如果它与Thread.Sleep in DoWork一起工作,则可能意味着您正在后台为UIThread创建一些工作。。。它可能会将其加入该地区。如果这没有帮助,那么我就帮不了你。我分析的是,
ServiceLocator
需要时间来初始化GUI控件,而不是将视图添加到
区域
调用。所以我认为这不会有什么不同。谢谢你的建议,是的,我试过使用Thread.Sleep和它的显示总线指示器(.在使用繁重的GUI时,有什么其他方法可以显示繁忙的指示器