1

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

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

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

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

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

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

工作应用程序的可视化树

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

在此处输入图像描述

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

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

4

1 回答 1

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 有它自己的恢复状态的方式,所以我可能不应该在这里这样做)......

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

于 2016-05-19T05:20:42.577 回答