Windowscommunitytoolkit: 如何使用 NavigationView BackButton 处理 MasterDetail Back?

创建于 2018-09-19  ·  49评论  ·  资料来源: windows-toolkit/WindowsCommunityToolkit

使用 NavigationView BackButton 处理 MasterDetail Back

当前行为

在 Windows Template Studio 中,我们使用不同项目类型(空白、导航窗格、枢轴)中的 Windows 社区工具包控件创建 MasterDetail 页面。

在导航窗格中,我们正在制作不同的概念证明以集成 WinUI NavigationView 而不是 SDK NavigationView,并将返回导航从 Back System Button 移动到 NavigationView Back Button。

我们想知道如何指定 MasterDetail 控件以停止使用 Syste Navigation Button 以仅使用 NavigationView 按钮。

您可以阅读原始问题并获取PoCApp

image

Windows 10 内部版本号:

  • 2018 年 4 月更新 (17134)

应用最小和目标版本:

  • 秋季创作者更新 (16299)
controls feature request

最有用的评论

无论决定什么选项,我都会控制它。 我们需要决定,我们要

  1. 如果新的导航视图到位并提供完全关闭后退按钮的方法,请使用标准的后退按钮和“点亮”
  2. 提供一个新的枚举选项,允许开发人员在标准后退按钮、导航视图后退按钮和关闭之间进行选择

投票 👍 为 1 和 🎉 为 2

所有49条评论

@skendrot可能会在这里提供帮助

好像@skendrot很忙,其他人可以看看吗? @nmetulev ?

嘿,正在度假,感谢您的额外ping。 我认为我们目前没有处理这个问题,但这是我们一直在谈论的事情。 我们已经讨论过一种关闭显示/隐藏/使用系统后退按钮的方法。 但我也可以看到,也许我们也可以与新的导航视图集成。
您如何看待以下问题:

  • 默认使用系统后退按钮。 如果存在新的导航视图,请改用它
  • 可以选择完全关闭后退按钮并允许开发人员决定如何处理

我们也可以有一个枚举来控制后退按钮
系统、导航视图、关闭

我喜欢使用枚举来控制行为,这似乎是对开发人员最友好的处理方式。 有一种方法可以完全关闭它并让开发人员处理返回导航对于我们无法立即支持的未来场景也很有意义

对此有一个枚举并默认关闭系统后退按钮如何,然后开发人员可以根据需要打开它? 因为在未来的文档中鼓励 NavigationView 中的新后退按钮导航。

IMO,除非我们可以检测到新的导航视图,否则将为现有用户创建行为更改。 @skendrot ,你怎么看?

是的,这是一个公平的观点,控制现有用户也非常重要,我同意。

第一条评论中提到了这一点。 保持原样,但看看我们是否有一个新的 NavigationView 作为视觉父级。 如果是这样,我们应该只将它用于后退按钮而不是系统后退按钮。 我认为如果开发人员想要自己控制一切,我们仍然应该提供一种完全关闭它的方法

是的@skendrot选项总是很灵活,并且在进行重大转换时总是特别

无论决定什么选项,我都会控制它。 我们需要决定,我们要

  1. 如果新的导航视图到位并提供完全关闭后退按钮的方法,请使用标准的后退按钮和“点亮”
  2. 提供一个新的枚举选项,允许开发人员在标准后退按钮、导航视图后退按钮和关闭之间进行选择

投票 👍 为 1 和 🎉 为 2

我将这两者结合起来,并使用枚举通过提供三个值来控制后退按钮的点亮方式:

  • 自动 - 默认(它自己确定如何处理后退导航)
  • 遗产
  • 离开

我建议您提供明确的枚举选项,而不是 Automatic、Legacy 和 Off。 例如

返回按钮行为:

  • 显示内联
  • 使用外部
  • 返回禁用

DisplayInline将是默认的,遵循在控件中显示标准样式的后退按钮的指导。 这也适用于游戏手柄上的 B 按钮,或当控件具有焦点时键盘上的退格键。

UseExternal将允许您在代码中设置、您自己放置的后退按钮控件、外壳控件(在标准窗口的标题栏中,或在设置窗口的下方栏中)或来自另一个控件。 我想您可以在 XAML 中提供一个控件名称,该名称将触发并覆盖该控件的后退按钮按下事件。

BackDisabled将完全禁用后退导航。

开发人员和像 Template 10 这样的项目可以创建一个页面或模板页面,其中的设置允许他们控制后退按钮的使用。

同意@mdtauk!

@mdtauk是的,这个建议确实更有意义,而且看起来更强大。

我完全可以在控件内部创建一个后退按钮,它与当前的后退按钮指南相匹配。

但是,我们还应该为 NavigationView 后退按钮提供自动处理。 我认为禁用后退导航也没有意义,这应该是用户应该处理的事情

这是我更新的建议

枚举:BackButtonHandling

  • 自动(默认)- 除非 NavigationView 是父级,否则使用内联按钮,然后使用 NavigationView 返回导航

  • 内联- 使用内联按钮

  • 遗留- 需要确保我们为那些还没有离开它的开发人员支持 shell 后退按钮

  • 手动- 让用户绘制他们自己的后退按钮并按照他们的意愿进行操作

而不是Legacy怎么样SystemSystemAppViewBackButtonAppView或其他东西

此外,为了保持向后兼容性,并且没有重大更改,默认值不应该是遗留选项。 然后在下一个主要版本中,我们可以将默认值更改为 auto

我更喜欢系统而不是传统,那要好得多

由于下一个版本是一个重大更新 (5.0),因此我对默认值并不特别感兴趣。 我可以将其默认为 System,然后在 6.0 中将默认值更改为 Automatic。

并且可以有一个通知作为警告系统后退按钮将在未来版本(6.0)中被弃用? 还是系统后退按钮始终是一个选项,即使在套装发布后(可能在 2019 年 4 月发布)?

我们可能不会弃用系统后退按钮,直到它从平台上弃用。

即使使用 Sets,系统后退按钮也不会被弃用。 它只会将它放在标签下方的栏中,上面有一个后退按钮。 但是如果 Sets 在那里,你绝对应该切换到应用程序内按钮

image

是的,我应该澄清一下:如果它也将从平台中弃用,我们应该只弃用枚举中的选项(我不相信有任何计划这样做)

所以显然有一个完整的工具栏只用于 1 个后退按钮(在集合的情况下)? 或者会有更多的平台控制吗?

所以显然有一个完整的工具栏只用于 1 个后退按钮(在集合的情况下)? 或者会有更多的平台控制吗?

我不知道外壳会添加任何其他控件。 但正是因为这远非 Back Navigation 的优雅解决方案 - 指导是在应用程序中处理它。

如果您考虑一下,后退按钮位于 Sets 选项卡内。 它不会出现在选项卡旁边,因此也不会出现在标题栏中。

是的,它看起来浪费了太多的 UI 空间,那里只有 1 个按钮。

@touseefbsb到目前为止,如果您选择让 Shell 使用 Sets 窗口处理后退按钮,那么这就是标准行为。 由于 Sets 仍未包含在 Windows 版本中,这可能会改变,但最好启用控件/应用程序外壳来处理绘制后退按钮,而不是让标题栏处理它。

我同意,这就是为什么我也认为远离标题栏的东西,甚至根本不将应用程序扩展到标题栏,这将有助于应用程序正确地与集合一起使用。

Sets 甚至可能不会出现在 19H1 版本中,因此就目前而言,让应用程序看起来不错并在可能的情况下扩展到标题栏非常重要。 开发人员还可以选择不允许他们的应用程序使用 Sets,因此具有控制的灵活性,以及​​在 Sets 选项卡中运行时更改/覆盖默认值是有意义的。 至少它对我有用,哈哈

@mdtauk如果开发者选择不在集合中使用他们的应用,这是否意味着他们的应用不会被打开到集合中?

@touseefbsb这就是我的理解。 当从另一个选项卡打开时,它会出现在自己的窗口中,也不能与其他选项卡一起存储。

支持新的 NavigationView 的小复杂功能。 BackRequested事件处理程序不包含取消事件或标记它已被处理的方法。 如果没有这种能力,MasterDetailsView 将处理从 Details 到 Master 视图的移动,然后开发人员也将处理返回状态。
我们可以支持 IFF 框架也被用于帮助导航。

@mvegaca ,您是否使用框架来托管控件? 如果不是尝试在 NavView 上处理,我们在 Frame 上处理(这也应该处理 NavView 之外的场景)怎么办?

我们已经处理了框架导航,所以它已经内置了。除非也有框架,否则我们不能依赖使用新的 NavigationView

因此,如果 WTS 在 NavView 中使用 Frame 进行导航,它应该已经可以工作了吗?

是的,带有不需要的附加功能。 MasterDetailsView 将启用 WTS 不想要的系统后退按钮。 但是,如果他们通过在框架中导航来处理 NavigationView 后退按钮,那么 MasterDetailsView 将捕获该事件,如果它是折叠的 Details 状态,则将其标记为取消并移回主视图。

我们 (WTS) 在 NavView 中使用了一个框架。 导航视图后退按钮已经在工作,但显示了一个额外的系统后退按钮。 为了处理返回导航,我们执行 Frame.GoBack,但我们的问题是返回之前显示的系统后退按钮。 所以,我不确定我们是否还好。 有没有办法测试这个?

是的,这就是@skendrot的 PR 正在修复的问题 (#2561)。 如果您也可以对其进行测试,那就太棒了。

@nmetulev我正在尝试在@skendrot的 git 存储库克隆中测试新的 BackButtonBehaviorProperty,但我无法将应用程序直接编译到库中。
您能否批准 PR 以在 MyGet CI 包中测试此更改?

谢谢

@mvegaca我在尝试测试时遇到了同样的问题。 我无法引用我本地的程序集副本。 我们需要弄清楚这里发生了什么,因为它使测试问题变得更加困难

您在测试组件时遇到了哪些问题?

我们在 WCT 解决方案中添加了一个 PoC 应用程序,删除了 nuget 包引用和直接对项目的引用。
当我编译项目时,在所有 XAML 文件中都出现以下错误:

xml C:\dev\skendrot\UWPCommunityToolkit\Issue2475PoC\Issue2475PoC.csproj : XamlCompiler error WMC1013: XAML files 'App.xaml' and 'App.xaml' have the same project path 'App.xaml'. Each file must have a unique project path.

如果我向解决方案添加一个空的新 UWP App1,也会发生这种情况。
xml XAML files 'App.xaml' and 'App.xaml' have the same project path 'App.xaml'. Each file must have a unique project path. App1 C:\dev\skendrot\UWPCommunityToolkit\App1\App1.csproj

谢谢@nmetulev ;)

我建议在本地构建 nugets 并引用它们。 您可以使用build\build.ps1脚本来完成,该脚本应该在 bin 文件夹中生成 nuges。

@mvegaca我看到的同样问题

不幸的是,无法直接引用这些项目,因为它们取决于解决方案配置。 对于开发,我倾向于直接在新项目中链接源文件,因为这似乎比在示例应用程序中开发更好更快。 为了测试,我总是在本地构建 nugets 并参考那些

我们在本地测试过,效果很好😄
如果一切顺利,您可以合并 PR。

谢谢大家

image

公关合并

@nmetulev

我尝试在预发布版本 5.0.0-preview.gb86cb1c4cb 中使用它,但属性 BackButtonBehavior 不可用。

你认为这个修复什么时候会在预发布版本上可用,什么时候会在稳定版本上可用?

谢谢

是的,它将在下周的 5.0.0 版本中提供。 它也可以在 MyGet 上预发布: https ://dotnet.myget.org/gallery/uwpcommunitytoolkit

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

shweaver-MSFT picture shweaver-MSFT  ·  3评论

kusanagi2k2 picture kusanagi2k2  ·  4评论

ilinkmobility picture ilinkmobility  ·  4评论

deltakosh picture deltakosh  ·  3评论

karmaecrivain94 picture karmaecrivain94  ·  3评论