首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Show.Busy()和Show.NotBusy()

Show.Busy()和Show.NotBusy()
EN

Stack Overflow用户
提问于 2011-03-10 16:14:40
回答 1查看 540关注 0票数 1

我有一个用Show.Dialog()显示的对话框,并在一个附加到视图的加载事件的方法中包含了这些步骤:

  1. Show.Busy()
  2. Possible长期运行的web请求(这里有一个自定义异步IResult ),如果通过Show.MessageBox()
  3. Show.NotBusy()

出错,

  • 将弹出。

我发现,如果您在步骤2中关闭我的视图需要一段时间,然后重新打开,则不会显示新视图上步骤1的繁忙指示符。

因此,起初,我认为这是我的错,并提出了一个简单的机制,以取消第4步,如果视图关闭。但没有运气..。

从它的外观来看,步骤1中的Show.Busy()试图与已经关闭的视图交互。这是卡里本的窃听器吗?

我的ViewModel是单例的,所以这也可以归因于我认为的问题。对于一个测试,我切换到一个IsBusy布尔属性,这个问题就没有了。但是,在我的整个应用程序中,这将是一个很大的改变。

有什么解决办法吗?或者卡利伯恩的人能帮我吗?我使用的是最新版本的卡利伯恩完整版本。

更新:

我尝试了马可的解决方案,导入了IBusyService,并在我的ViewModel中这样做了:

代码语言:javascript
运行
复制
public override void TryClose(bool? dialogResult)
{
    _busyService.MarkAsNotBusy(this);

    base.TryClose(dialogResult);
}

但这似乎没什么用。如果我做了一个简单的复制品会有帮助吗?

更新2:

我继续做了一次复制,因为很多时候都会发现问题。

事实证明,这与我必须直接打电话给IWindowManager有关。我的应用程序部分是带有插件体系结构的WinForms,我们使用了几个基于杯标的插件。

下面是引起此问题的代码示例:

代码语言:javascript
运行
复制
    if (_child.IsActive)
    {
        _child.BringToFront();
    }
    else
    {
        _manager.ShowWindow(_child);
    }

这在WinForms NotifyIcon MenuItem的单击事件处理程序中。

_child是一个屏幕,其中BringToFront()调用底层视图的激活方法(当然是通过服务)。_manager是IWindowManager。

如果您运行的是直接的卡里本,Show.Dialog()不会引起问题。

有什么解决办法吗?我不确定这是不是卡利伯恩问题了,但可能是直接使用IWindowManager造成的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-10 23:41:14

繁忙的VM(和相关的繁忙指示符UIElement)保存在DefaultBusyService的注册表中。

我的猜测是,当VM在标记为“不忙”之前关闭时,相关条目将保存在注册表中,因此当再次显示相同的VM实例时,将阻止服务在较新的UIElement上工作。

不过,我应该多调查一些;我提出了一个问题:http://caliburn.codeplex.com/workitem/8395

作为一种临时解决方法,您可以尝试在VM关闭阶段调用IBusyService.MarkAsNotBusy,传递VM本身的引用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5262471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档