我有一个caliburn Micro应用程序,我在bootstrapper中加载了几个数据表。 我正在将其注入MEF,以便稍后在应用程序中使用。
我想向用户显示进度的启动画面。到目前为止,这一切都很好。 我正在使用EventAggregator让各个类将消息抛出到Splash Screen ViewModel,但UI线程似乎无法更新我的文本标签。我的属性设置正常,我正在调用NotifyOfPropertyChange,但是我的窗口似乎被冻结了,我的绑定属性上的get祖先没有被调用。
public string Message
{
get
{
return this.message;
}
set
{
this.message = value;
//new System.Action(() => NotifyOfPropertyChange(() => Message)).BeginOnUIThread();
//App.Current.Dispatcher.Invoke(() => NotifyOfPropertyChange("Message"));
NotifyOfPropertyChange(() => Message);
}
}
public void Handle(StartupNotification message)
{
Message = message.Message;
}
Handle来自Caliburn.Micro IHandle EventAggregrator。数据被加载到引导程序中,我假设这个线程与UI线程是分开的,但我不会亲自创建任何线程。
在我的引导程序中,我按如下方式加载:
events.Publish(new StartupNotification("Loading Feeds..."));
batch.AddExportedValue<IFeedService>(new FeedService());
我试图通过间接措施触发UI,但由于某种原因我的主屏幕保持冻结状态。 任何人都可以表明我做错了吗?
最诚挚的问候, 马丁
答案 0 :(得分:0)
引导程序在UI线程中运行,我假设你有这样的东西:
protected override void OnStartup(object sender, System.Windows.StartupEventArgs e)
{
DisplayRootViewFor<ShellViewModel>();
RunLongLoadingOperation();
}
您应该执行类似
的操作 protected override void OnStartup(object sender, System.Windows.StartupEventArgs e)
{
DisplayRootViewFor<ShellViewModel>();
var task = Task.Factory.StartNew(RunLongLoadingOperation);
// task error handling omitted,
// if your long operation can throw an exception you should
// add an oncompleted handler and do something with it or the
// app will be brought down when the task gets GC'd
}
答案 1 :(得分:-2)
现在已经解决了,我已将数据库加载移动到后台工作程序中,并在其中添加了Thread.Sleep,以便让UI有时间更新ProgressChanged事件。
我希望.NET能够解决这个问题,因为我已经将它移动到了后台工作者,但是很好。