Blinue / Magpie

An all-purpose window upscaler for Windows 10/11.
GNU General Public License v3.0
9.69k stars 496 forks source link

移植 SettingsControls #771

Closed Blinue closed 11 months ago

Blinue commented 12 months ago

Close #769

这个 PR 移植了 Windows Community Toolkit 中的 SettingsCard 和 SettingsExpander 控件以及它们的依赖项IsEqualStateTrigger、IsNullStateTrigger 和 ControlSizeTrigger,删除了旧版 SettingsCard。还有一些 UI 优化。

并非原样移植,移植过程中进行了一些优化、重构和修复,以满足我们自己的需求。

  1. IsEqualStateTrigger 事实上无法移植为 C++,问题在于 C++ 无法实现 C# 中的 object.Equals。IPropertyValue 虽然提供了获取类型的接口,但不支持结构体和枚举类型,IPropertyValue 也不提供获取底层字节的接口。由于 IsEqualStateTrigger 只在 SettingsCard 中用于比较 ContentAlignment,因此移植的版本只支持 ContentAlignment。
  2. IsNullStateTrigger 原为 IsNullOrEmptyStateTrigger,不过没有需要判断集合是否为空的情况,因此进行了简化。
  3. SettingsCard 添加 IsWrapEnabled 属性,为 true 时会根据控件宽度自动切换布局。
  4. SettingsExpander.Items 的容器从 ItemsRepeater 改为 ListView,因为 ItemsRepeater 托管在 XAML Islands 中时有渲染 bug https://github.com/microsoft/microsoft-ui-xaml/issues/2349
  5. SettingsExpander 添加 CanReorderItems 属性,为 true 时可拖拽子项,这用于实现缩放配置的 UI。

我计划接下来优化 SettingsCard 的布局,使得可以智能切换水平和竖直排列,这将在另一个 PR 中完成。