XAML页面之间的交叉导航

时间:2016-09-23 01:03:51

标签: c# wpf xaml mvvm

我有两个XAML页面,每个页面都是不同MVVM模式的一部分;称他们为PageA和PageB。每个MVVM框架都在不同的命名空间和项目中,因为它们之间没有合作;称它们为SpaceA和SpaceB,以及ProjectA和ProjectB。

除外:在某些时候,SpaceA框架想要导航到PageB,而在另一点上,SpaceB想要导航到PageA。 明显的挑战是这(不可避免地?)导致框架之间的循环引用:

Frame.Navigate(typeof(SpaceA.PageA)); /* circular */ Frame.Navigate(typeof(SpaceB.PageB));

<<这个问题的原始形式没有代码,这可能使它太模糊或广泛。所以我添加了它。>>

以下是PageA的代码:

<Page x:Class="SpaceA.PageA" ...><Button Tapped="onTap">Go to Page B</Button>

使用CodeBehind

namespace SpaceA
{
    public sealed partial class PageA : Page
    {
    private void onTap(...) { Frame.Navigate(typeof(SpaceB.PageB)); }
    }
}

这是PageB的代码:

<Page x:Class="SpaceB.PageB" ...><Button Tapped="onTap">Go to Page A</Button>

使用CodeBehind

namespace SpaceB
{
    public sealed partial class PageB : Page
    {
    private void onTap(...) { Frame.Navigate(typeof(SpaceA.PageA)); }
    }
}

为简单起见,我遗漏了VM和Model元素中的所有(相当复杂的)逻辑。但它们之间没有耦合,除了页面相互调用。由于循环依赖,上述内容不会组合。

我可以看到几种解决方案。

我可以将它们全部组合到同一个命名空间中;但这似乎很可惜,因为它们只是偶然通过这种交叉导航,这就是我计划将它们放在不同组件中的原因。虽然我在使用命名空间时可能过于精细了?

或者我可以通过在第三个名称空间中知道SpaceA和SpaceB的两个虚拟页面来做一些奇特的事情,以便通过该虚拟页面完成导航。但这看起来很丑陋,因为我必须纠正后退/前进导航堆栈,我想。

或者将页面本身移动到他们自己的共享空间,比如SpacePage,然后将其余的MVVM模式留在各自的空间中?

但似乎这应该是一种常见的模式,并且应该比上述任何一种更清晰地解决。

1 个答案:

答案 0 :(得分:0)

问题在于我混淆了命名空间和项目的语义。

将每个MVVM放在不同的命名空间中没有问题;问题是每个人都在一个不同的项目中。解决方案是将它们移动到所有相同的项目中,理想情况是在单独的文件夹中以维护结构。