使用 ReactiveUI 创建类似 Visual Studio 的 Start Window 的最佳方法是什么?

What is the best approach to create a Visual Studio-like Start Window using ReactiveUI?

我想选择“开始”/“欢迎”/“解决方案”window,它与 VS19/VS22 中使用的功能相似,但我不确定具体如何操作。

有关更多上下文,我当前的 StartWindowView 有一个“创建新项目...”按钮,它应该用一个 2 页的项目创建向导替换整个 window 内容。

第 1 页应该是“基本选项”,底部有“取消”和“下一步”按钮(“取消”返回到原始 StartView,“下一步”转到 Page2View)。

第 2 页应该是“额外选项”,底部有“返回”和“完成”按钮(“返回”返回到 Page1View,“完成”返回到 StartView,返回一个 ProjectModel)

据我了解,这些是我必须处理的 ViewModel:

StartWindowViewModel // Main window host (possible router)
    StartViewModel // Main project selection view
    ProjectCreationViewModel // Possible router for Page1 & Page2
        ProjectCreationPage1ViewModel // Basic options
        ProjectCreationPage2ViewModel // Extra options

我的想法是使用路由,但我不知道这是否是正确的方法,因为我不确定来回时是否会保留 Page1 和 Page2 之间的数据。 此外,我看到的 ReactiveUI 路由示例在底部修复了“后退”和“下一步”按钮,因此这让我觉得这可能不是我的问题的解决方案,因为按下“创建新项目...”按钮将 StartViewModel 替换为 ProjectCreationViewModel,从而无法进行手动导航。

虽然我可能完全错了。我真的不确定如何解决这个问题。

编辑:这是 VS22 启动 window 的样子: 这就是当您按下标有红色的按钮时发生的情况: 可以看到,整个window改变了当前View。

这并不难,只需保留视图模型堆栈的可观察集合,并始终显示最后一个(或第一个,使用 WPF 绑定更容易)。请注意,我将把它称为堆栈,但还没有为您构建的 ObservableStack<>。使用 ObservableCollection<> 或构建您自己的可观察堆栈。

然后当您需要导航“进入”您的向导(新项目、克隆存储库等)时,您只需将新的子视图模型推入堆栈即可。当您需要导航“离开”您的向导时(即取消时),从堆栈中弹出最后一个视图模型。

最后一步是将您的视图关联到视图模型(在高级资源块中使用 DataTemplate,可以是起始页中的全局资源块或本地资源块),然后绑定您的视图模型堆栈顶部到您的主要 window(shell 有一个 ContentControl 绑定到您的堆栈顶部)。