Caliburn.Micro 中 ActivateItem 之后的操作

Action after ActivateItem in Caliburn.Micro

我有一个问题。我有启动按钮 ActivateItem:

    public void LoadTaskManagerPage()
    {
        this.ActivateItem(new TaskManagerViewModel(this.LoggedUser, this.repository));

        if (this.LoggedUser.GetUserTask() != null)
        {
            this.IsActiveTaskButtonVisible = Visibility.Visible;
            this.NotifyOfPropertyChange(() => this.IsActiveTaskButtonVisible);
        }
    }

如果 ActivateItem 结束,是否可以 hang 一个应用程序并仅转到 if 语句?

如何在 Caliburn.Micro 中等待 ActivateItem 结束?

编辑:

尝试类似的东西:

    public void LoadTaskManagerPage()
    {
        var taskManagerTask = Task.Run(() => this.ActivateItem(new TaskManagerViewModel(this.LoggedUser, this.repository)));
        taskManagerTask.Wait();

        if (!this.LoggedUser.GetUserTask().IsTaskTakenByUser())
        {
            this.IsActiveTaskButtonVisible = Visibility.Visible;
            this.NotifyOfPropertyChange(() => this.IsActiveTaskButtonVisible);
        }
    }

使用任务,但是当我单击 LoadTaskManagerPage() 时它不会显示任何内容 window,应用程序永远挂起

EDIT2

基于我在 github 上的 issue,我将 Caliburn 升级到 alpha 4.0

public void LoadTaskManagerPage()
    {
        this.ActivateItemAsync(new TaskManagerViewModel(this.LoggedUser, this.repository));

        if (!this.LoggedUser.GetUserTask().IsTaskTakenByUser())
        {
            //logic
        }
    }

我将 ActiveItem() 更改为 ActiveItemAsync(),但它仍然在活动项目关闭之前命中 if 语句。使用 async/await 做同样的事

EDIT3

当我制作async/await时它仍然有效,请看右边的视图。它被点击了,User Control 没有出现。同时(即使我的 User Control 没有出现)我过早地点击了 if 语句。我想在 User Control 关闭时点击它。

您应该等待 ActivateItemAsync 方法。这意味着你的 LoadTaskManagerPage() 应该 return 一个 Task 你也应该 await 这个:

public async Task LoadTaskManagerPageAsynnc()
{
    await this.ActivateItemAsync(new TaskManagerViewModel(this.LoggedUser, this.repository));

    if (!this.LoggedUser.GetUserTask().IsTaskTakenByUser())
    {
        //logic
    }
}