【问题标题】:Action after ActivateItem in Caliburn.MicroCaliburn.Micro 中 ActivateItem 后的操作
【发布时间】:2019-05-26 10:25:30
【问题描述】:

我有一个问题。我有启动按钮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() 时它不会显示任何窗口,应用程序永远挂起

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 关闭它。

【问题讨论】:

  • 看起来你想在这里使用异步和等待。希望这对你有帮助c-sharpcorner.com/article/async-and-await-in-c-sharp
  • 你可以看看我的编辑
  • 您需要等待ActivateItemAsync。但是“在活动项目关闭之前”是什么意思?当您致电ActivateItemAsync 时会发生什么?您预计会发生什么?
  • @mm8 我正在为我的问题寻找解决方案。我启动ActivateItemAsync(),我想等待它结束,然后我想去if() 声明。正如您在 EDIT2 中看到的那样,我尝试了 await/async 并同时转到 If 语句,当我单击 LoadTaskmanagerPage 按钮时,将激活 User Control TaskmanagerViewModel跨度>
  • @michasaucer:你不需要等待 EDIT2 中的方法。

标签: c# wpf caliburn.micro


【解决方案1】:

您应该等待ActivateItemAsync 方法。这意味着您的LoadTaskManagerPage() 应该返回一个Task,而您也应该返回await 这个:

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

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

【讨论】:

  • 正如我在 Edit2 中所说,它不起作用。查看我的 Edit3
  • 您预计会发生什么?请提供MCVE
  • 我想等待窗口关闭(映射到TaskManagerViewModel),然后转到我在原始帖子中的函数中提到的 if 语句。我正在寻找解决方案
  • 为什么 ActivateItemAsync 会关闭一个窗口...?
  • 不会的,我想知道那个屏幕在ActivateItemAsync被关闭了,然后去if
猜你喜欢
  • 2015-06-04
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多