【问题标题】:MvvmCross with Template10MvvmCross 与 Template10
【发布时间】:2016-05-19 13:20:42
【问题描述】:

我正在尝试在此处为 TipCalc 示例创建 UWP 应用版本:https://github.com/MvvmCross/MvvmCross-Samples/tree/master/TipCalc

示例中已经有一个 UWP 版本,可以正常工作。但是,我正在尝试使用 Template10 (https://github.com/Windows-XAML/Template10),但我无法让这两个库一起工作。

MvvmCross 想让我修改 OnLaunched 方法,该方法具有对根 Frame 的引用。然而,模板 10 反而抽象了这个方法,暴露了没有这样的引用的 OnStartAsync...

CreateRootFrame 模板 10 中有一个覆盖,这似乎是初始化 mvvmcross 应用程序的正确位置,但这似乎不像我预期的那样工作......

虽然启动的应用确实导航到了适当的页面,并且似乎也初始化了视图模型(相关 VM 中 Start 方法上的断点确实被命中),但页面本身是空白的。

比较两个应用程序的可视化树显示,虽然示例中现有的 UWP 应用程序有一个框架:

我的 Template10 应用正在加载一个模态对话框:

我fork了原始示例项目并添加了模板10版本,如果您想自己尝试一下:https://github.com/selaromdotnet/MvvmCross-Samples

还有其他人能够将 MvvmCross 与模板 10 集成吗?你知道我做错了什么吗,以及对一起使用这两个库的最佳实践有什么建议吗?

【问题讨论】:

  • 我还尝试将 start.Start() 方法移动到 OnStartAsync,但是当我这样做时出现此错误:错误将值 \"Type\" 转换为类型 'Template10.Services.SerializationService.JsonSerializationService+容器'。快速搜索表明这是一个已修复的错误,但更新到模板 10 的最新预览版没有效果,我得到了相同的结果
  • 其实我错了,更新到最新的 Template10(预览版)版本时没有得到相同的结果,而是根本没有调用 CreateRootElement,实际上已经过时了,所以我的应用程序从未初始化,我得到一个空引用错误。所以是的,肯定在这里迷路了,不胜感激!

标签: mvvmcross uwp template10


【解决方案1】:

嗯,根据此处的当前文档,ModalDialog 是 Template10 的预期行为:https://github.com/Windows-XAML/Template10/wiki/Docs-|-Bootstrapper

我对 Template10 不够熟悉,无法说明为什么会出现这种情况,但它也说您可以通过覆盖 OnInitializeAsync 来更改这一点,就像我所做的那样,以相同的方式恢复原始帧常规 UWP 项目的做法:

    public override async Task OnInitializeAsync(IActivatedEventArgs args)
    {
        Frame rootFrame = Window.Current.Content as Frame;

        // Do not repeat app initialization when the Window already has content,
        // just ensure that the window is active
        if (rootFrame == null)
        {
            // Create a Frame to act as the navigation context and navigate to the first page
            rootFrame = new Frame();


            if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
            {
                //TODO: Load state from previously suspended application
            }

            // Place the frame in the current Window
            Window.Current.Content = rootFrame;
        }

        if (rootFrame.Content == null)
        {
            var setup = new Setup(rootFrame);
            setup.Initialize();
        }
        await Task.CompletedTask;
    }

这成功了!我确定我还有很长的路要走(我相信 Template10 有它自己的恢复状态的方式,所以我可能不应该在这里这样做)...

但至少这个改变最终让我得到了一个可以工作的应用程序。如果您知道更多关于我在这里做错了什么或者我应该做的事情,您的 cmets 将不胜感激,谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多