【问题标题】:Prism RequestNavigate behaviorPrism 请求导航行为
【发布时间】:2016-08-19 15:10:05
【问题描述】:

我只知道 2 天,所以在尝试解释以下导航问题时,请不要因为任何错误假设而评判我。

假设我们只有 1 个区域和 2 个不同的视图。视图 A 从启动时由自定义 RegionBehavior 加载到该区域。我只使用该行为中 RegionManager 上的 RequestNavigate。我没有找到更好的解决方案来设置初始视图,但这不是这里的重点。

现在我们在每个视图上都有一个按钮来导航到另一个。这些命令在每个 ViewModel 上执行并再次调用 RequestNavigate。 我使用常量在容器 (Autofac) 中注册导航视图,并使用相同的常量调用 RequestNavigate。 乍一看一切正常。但后来我意识到,每次切换视图时,都会创建一个新视图和视图模型。更糟糕的是,RegionManager 仍然持有对所有以前的引用,这似乎是内存泄漏。我现在可以切换到将我的视图注册为单例,但我仍然不明白为什么 RegionManager 会这样工作。为什么他没有意识到他已经知道我请求导航的视图并激活该视图而不是创建新视图?那我还用什么常量作为名字呢?

然后我发现了这个帖子PRISM WPF - Navigation creates new view every time,确实解决了这个问题。一旦我使用类型的名称来注册视图,一切都会按预期工作。视图和视图模型在第一次使用时创建,然后在再次请求导航时重复使用。

如果这不是我想要的行为并且我更喜欢每次都创建新的视图/视图模型,我仍然可以实现 IRegionMemberLifetime 并在 KeepAlive 上返回 false。然后至少从 RegionManager 中删除前一个。 如果我不想擦除它们并且仍然想要这种旧的内存消耗行为,我仍然可以实现 INavigationAware 并在 IsNavigationTarget 中返回 false。这样,RegionManager 每次都会创建新实例,并且仍然保留对旧实例的引用。 相反,当注册名称不等于类型名称时,我无法阻止他创建新实例。在这种情况下甚至没有达到 IsNavigationTarget,这告诉我 RegionManager 根本不查找现有视图。那么为什么我们在这里有两种不同的行为,这取决于我为导航注册视图的名称? 当我认为两个名称相等时应用的行为应该是唯一的行为,因为仍然可以使用提到的附加属性创建所有其他场景,我错了吗?

史蒂夫

【问题讨论】:

    标签: navigation prism autofac naming


    【解决方案1】:

    您在容器中注册了一个具有某些名称的视图(模型)。然后可以在给定注册名称的情况下创建视图(模型)的实例。这允许 RequestNavigate 创建一个视图(模型)并在给定注册名称的情况下激活它。

    但是,当 RequestNavigate 检查区域中可能存在的目标视图实例(并且可能请求 IsNavigationTarget)时,它必须处理该区域中的视图(模型)实例。它们的注册名称不可用 - 只有容器知道它们。因此,RequestNavigate 假定注册名称是视图类型的 Name 或 FullName。

    因此,如果您想拥有所有功能,您应该在其类型名称下注册视图(模型)。有一种方便的方法可以做到这一点 - RegisterTypeForNavigation。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 2018-04-08
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多