XAML页面之间的交叉导航

本文关键字:导航 之间 XAML | 更新日期: 2023-09-27 18:08:28

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

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

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

& lt; & lt;这个问题的原始形式没有代码,这可能使它过于模糊或宽泛。所以我添加了它>>

下面是PageA的代码:

<Page x:Class="SpaceA.PageA" ...><Button Tapped="onTap">Go to Page B</Button>
与后台代码

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>
与后台代码

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

为了简单起见,我省略了VM和Model元素中的所有(相当复杂的)逻辑。但是它们之间没有耦合,除了页面相互调用之外。由于循环依赖,上面的代码不能组装。

我能想到几个解决办法。

我可以把它们合并到同一个命名空间;但这似乎很遗憾,因为它们只是通过这种交叉导航连接起来的,这就是我计划在不同的程序集中使用它们的原因。也许我对名称空间的使用太细了?

或者我可以做一些有趣的事情,在它们上面有一个虚拟页面,在第三个知道SpaceA和SpaceB的名称空间中,这样导航就通过这个虚拟页面完成了。但这看起来很难看,因为我必须纠正向后/向前导航堆栈,我想。

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

但这似乎应该是一个常见的模式,应该比上面的任何一个都更清晰。

XAML页面之间的交叉导航

问题是我混淆了名称空间和项目的语义。

将每个MVVM放在不同的命名空间中是没有问题的;问题是每个人都在不同的项目中。解决方案是将它们全部移动到同一个项目中,最好是在单独的文件夹中以保持结构。