如何在UWP中编写自定义选择器控件?

Dan*_*erg 5 xaml flyout win-universal-app uwp-xaml

我一直在仔细搜索网络,以获取有关此方面的任何指导,讨论或经验,我认为我可以肯定地说没有任何东西。

我们正在为UWP开发一套控件,我们计划将其开源并免费提供。我们正在构建的控件之一是TimeSpanPicker控件,其外观和行为本质上与TimePicker控件类似,但是它不仅限于一天中的某个时间(即24小时间隔),还允许用户编辑任意内容TimeSpan

通过使用内置TimePicker控件作为参考,从Windows Runtime API的可见元数据中整理出的内容,使我意识到涉及以下类型的组件:

  • 继承自的TimePicker控件本身Control
  • 继承自的TimePickerFlyoutPickerFlyoutBase
  • TimePickerFlyoutPresenter控制,其从继承Control

我意识到我需要模仿这种模式并为选择器控件编写这三个组件,但是我找不到有关这些组件如何组合在一起的信息,仅凭API表面,我认为不可能弄清楚。

具体来说,我想了解的主要内容是:

  • 如何TimePickerFlyout纳入TimePicker班级?我在选择器控件的默认模板内的任何地方都看不到弹出按钮的引用。
  • 起什么作用的TimePickerFlyoutPresenter控制播放,以及它是如何并入TimePickerFlyout类?本TimePickerFlyout类没有模板-那么它是如何实例化和与通信TimePickerFlyoutPresenter控制?
  • 模仿此模式的基本步骤是什么?
  • ShouldShowConfirmationButtonsOnConfirmed虚拟方法的预期用途是PickerFlyoutBase什么?当我在具体的实现中覆盖它们时,就永远不会调用它们。

如有任何指导,我将非常感谢!

Dan*_*erg 1

因此,自从有几个人要求我跟进此事后,在 Jim Walker (MSFT) 的帮助下,我实际上最终能够解决所有这些问题。已经过去很长时间了,但我现在决定重新审视这一点,并最终完成我正在研究的那些TimeSpanPicker和控件。TimeSpanEditor

https://github.com/IDeliverable/UwpControls

运行TestHost项目以查看两个控件的运行情况。

该存储库还包含一些其他控件;TimeSpanPicker包含和控件的部分TimeSpanEditor在这里:

https://github.com/IDeliverable/UwpControls/tree/master/src/IDeliverable.Controls.Uwp.TimeSpanPicker

对于任何对如何构建自定义选择器控件感兴趣的人来说,该代码有望成为一个非常好的示例,但这些控件对于需要TimeSpan向其应用程序添加编辑功能的任何人也应该很有用。我真的对这些控件很感兴趣,对细节和不明显的东西如可访问性、对多种输入模式的支持(触摸、键盘、鼠标)、系统主题合规性、完整的模板支持等进行了研究。

这两个控件的文档目前正在进行中。

我计划很快将这些控件打包为 NuGet 包,但现在,您必须将它们作为源代码使用。我还将检查是否有兴趣将它们合并到Window Community Toolkit中。