0

从我的主要观点来看,我目前正在启动一项相当长的操作。当此操作继续时,应该不可能按下主视图上的任何按钮。此外,应在另一个窗口中报告进度。我可以更新每个 CanXXX Guard 属性,但这将是大量代码。

我想使用 Caliburn.Micro 的 ShowDialog 方法,但是这个方法会等到 Window 返回一个返回值。那么如何使用不等待某些对话框返回的 Caliburn.Micro 显示模态窗口?

4

2 回答 2

2

我过去做过这个...

在您的主/外壳视图中 -

<ContentControl IsEnabled="{Binding UILocked, Converter={StaticResource BooleanInverter}}">
    <SomeOtherControls..... blah blah />
</ContentControl>

在主/外壳视图模型中 -

public bool UILocked { get { // getter } set { // prop changed code/setter etc... } }

设置UILocked为 true 后,应禁用整个 UI。ContentControl将禁用所有子元素,IsEnabled其子元素的绑定将被忽略

您可以确保主视图也订阅事件聚合器:

public class MainViewModel : IHandle<ChangeUIStateMessage>
{
    public bool UILocked { get { // getter } set { // prop changed code/setter etc... } }

    public MainViewModel(IEventAggregator aggregator)
    {
        aggregator.Subscribe(this);
    }

    public void Handle(ChangeUIStateMessage message)
    {
        UILocked = message.UILocked;
    }
}

消息类可能很简单:

public class ChangeUIStateMessage
{
    public bool UILocked { get; private set; }

    public ChangeUIStateMessage(bool uiLocked)
    {
        UILocked = uiLocked;
    }
}

然后,您可以通过聚合器从任何 VM 触发它以锁定/解锁 UI

aggregator.Publish(new ChangeUIStateMessage(true));

如果需要,您还可以修改处理程序,以便维护已启动锁定的对象列表,确保 UI 被锁定直到所有工作人员完成(以防多个 VM 同时启动锁定/解锁操作)

编辑:忘记添加 - 如果您的弹出控件位于单独的可视化树中(通常是弹出窗口),它们将不会被禁用,这在大多数情况下对您有利(交互式弹出窗口/锁定的应用程序)。

于 2013-08-01T15:53:18.650 回答
1

您可能需要考虑扩展 WPF 工具包提供的BusyIndi​​cator

于 2013-08-01T16:42:05.170 回答