我有一个用Show.Dialog()显示的对话框,并在一个附加到视图的加载事件的方法中包含了这些步骤:
出错,
我发现,如果您在步骤2中关闭我的视图需要一段时间,然后重新打开,则不会显示新视图上步骤1的繁忙指示符。
因此,起初,我认为这是我的错,并提出了一个简单的机制,以取消第4步,如果视图关闭。但没有运气..。
从它的外观来看,步骤1中的Show.Busy()试图与已经关闭的视图交互。这是卡里本的窃听器吗?
我的ViewModel是单例的,所以这也可以归因于我认为的问题。对于一个测试,我切换到一个IsBusy布尔属性,这个问题就没有了。但是,在我的整个应用程序中,这将是一个很大的改变。
有什么解决办法吗?或者卡利伯恩的人能帮我吗?我使用的是最新版本的卡利伯恩完整版本。
更新:
我尝试了马可的解决方案,导入了IBusyService,并在我的ViewModel中这样做了:
public override void TryClose(bool? dialogResult)
{
_busyService.MarkAsNotBusy(this);
base.TryClose(dialogResult);
}但这似乎没什么用。如果我做了一个简单的复制品会有帮助吗?
更新2:
我继续做了一次复制,因为很多时候都会发现问题。
事实证明,这与我必须直接打电话给IWindowManager有关。我的应用程序部分是带有插件体系结构的WinForms,我们使用了几个基于杯标的插件。
下面是引起此问题的代码示例:
if (_child.IsActive)
{
_child.BringToFront();
}
else
{
_manager.ShowWindow(_child);
}这在WinForms NotifyIcon MenuItem的单击事件处理程序中。
_child是一个屏幕,其中BringToFront()调用底层视图的激活方法(当然是通过服务)。_manager是IWindowManager。
如果您运行的是直接的卡里本,Show.Dialog()不会引起问题。
有什么解决办法吗?我不确定这是不是卡利伯恩问题了,但可能是直接使用IWindowManager造成的。
发布于 2011-03-10 23:41:14
繁忙的VM(和相关的繁忙指示符UIElement)保存在DefaultBusyService的注册表中。
我的猜测是,当VM在标记为“不忙”之前关闭时,相关条目将保存在注册表中,因此当再次显示相同的VM实例时,将阻止服务在较新的UIElement上工作。
不过,我应该多调查一些;我提出了一个问题:http://caliburn.codeplex.com/workitem/8395
作为一种临时解决方法,您可以尝试在VM关闭阶段调用IBusyService.MarkAsNotBusy,传递VM本身的引用。
https://stackoverflow.com/questions/5262471
复制相似问题