首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么OnActivate (与现代ui一起使用)不是在ActivateItem之后调用的?

为什么OnActivate (与现代ui一起使用)不是在ActivateItem之后调用的?
EN

Stack Overflow用户
提问于 2014-10-07 16:53:47
回答 1查看 1.8K关注 0票数 4

我在一个Caliburn.Micro应用程序中使用Modern-UIModern-UI。在现代ui框架(即UserControl)中的“页面”上,我试图使用Conductor切换当前视图。到目前为止,我得到的是:

注意:为了简洁起见,从源代码中删除了名称空间。

现代用户界面窗口中“页面”的XAML

代码语言:javascript
复制
<UserControl x:Class="ShellView">
    <ContentControl x:Name="ActiveItem" />
</UserControl>

源用于ShellViewModel (导体)

代码语言:javascript
复制
[Export]
public class ShellViewModel : Conductor<IScreen>.Collection.OneActive
{
    private readonly Test1ViewModel m_TestView1;
    private readonly Test2ViewModel m_TestView2;

    public ShellViewModel()
    {
        this.m_TestView1 = new Test1ViewModel();
        this.m_TestView2 = new Test2ViewModel();

        this.ActivateItem(this.m_TestView1);
    }
}

Test1View的XAML目前没有任何内容,只有普通的UserControl内容。

Test1ViewModel

代码语言:javascript
复制
public class Test1ViewModel : Screen
{
    protected override void OnActivate()
    {
        //This DOES NOT show or fire, I even put a breakpoint to double check
        Debug.Print("This should show in output");
    }
}

ActivateItem被调用时,OnActivate根本不会触发。我甚至试着在售票员的视图模型Test1ViewModel上调用Test1ViewModel,但这不起作用。我使用的是Modern-UI,这可能很重要,因为同样的事情在不使用Modern-UI的不同项目中起作用。当调用ActivateItem时,相应的视图确实会显示在屏幕上(我添加了一些按钮来验证视图是否发生了变化)。

对于为什么UserControl在调用ActivateItem之后会在ContentControl中显示,但OnActivate根本不开火,有什么想法吗?

还有一件事。这也可能与它有关,但如果有,我不知道为什么或如何修复它。我使用这个类使视图优先( Modern-UI )与Caliburn.Micro的模型优先( model )方法很好地工作。

代码语言:javascript
复制
internal class ModernContentLoader : DefaultContentLoader
{
    protected override object LoadContent(Uri uri)
    {
        object content = base.LoadContent(uri);
        if (content == null)
            return null;

        // Locate the right viewmodel for this view
        object vm = ViewModelLocator.LocateForView(content);
        if (vm == null)
            return content;

        // Bind it up with CM magic
        if (content is DependencyObject)
            ViewModelBinder.Bind(vm, content as DependencyObject, null);

        return content;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-08 15:39:11

我去下载了Caliburn.Micro的源代码,并像我从一开始就应该做的那样调试了整件事情。

事实证明,由于Modern-UI处理导航的方式,Conductor (除非它是附加到主窗口的主shell视图)没有被激活。换句话说,它永远不知道它正在被显示,而卡利伯恩的源代码在允许激活一个新视图之前,会检查Conductor是否处于活动状态。由于某些原因,视图显示得很好,但是View Model (Screen)从未被激活或实例化。在我的例子中,由于Modern-UI+Caliburn.Micro视图绑定hack,它被实例化了。

我最终还是让它起作用了,所以如果有人感兴趣的话,这就是如何让ActivateItemConductor一起在Modern-UI中工作。

将以下代码行添加到导体的构造函数或现代UI方法OnNavigatedTo

代码语言:javascript
复制
ScreenExtensions.TryActivate(this);

这是Caliburn-Micro的一部分,将允许您的Conductor正确地激活项。如果在OnNavigatedTo中使用它,则可能需要将这一行添加到OnNavigatedFrom方法中:

代码语言:javascript
复制
ScreenExtensions.TryDeactivate(this, true);
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26241193

复制
相关文章

相似问题

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