Skip to content

迁移:窗口体系演进

Spec 054 有意移除了一些遗留的窗口字段,改用更显式的表达形式。除下列破坏性变更外,新 API 都是增量式的。

已移除 / 已变更的 API 替代者 迁移方式
IsResizable(bool) ResizeModeWindowResizeMode IsResizable = falseResizeMode = WindowResizeMode.NoResize。旧的默认值 true 对应新的默认值 CanResize
IsShownInSwitchers(bool) ShowInTaskbar + ShowInSwitcher IsShownInSwitchers = falseShowInTaskbar = false, ShowInSwitcher = false
IsAlwaysOnTop(bool) LevelWindowLevel IsAlwaysOnTop = trueLevel = WindowLevel.AlwaysOnTop
WindowStartPosition.RestoreFromPersistence .WithPersistence(id)PersistPlacement = true 旧写法:StartPosition = WindowStartPosition.RestoreFromPersistence, PersistenceId = "main"。新写法:new WindowSpec { Title = "Main" }.WithPersistence("main")
ExtendsContentIntoTitleBarbool ExtendsContentIntoTitleBarbool?)加上 TitleBar(...) 推断 如果存在 TitleBar(...) 元素,就去掉 ExtendsContentIntoTitleBar = true,让 Reactor 自行推断。只有在没有 TitleBar(...) 却要做内容延伸时才显式写 true;要强制使用系统标题栏则显式写 false

示例

// Before
// new WindowSpec
// {
//     Title = "Tools",
//     IsResizable = false,
//     IsShownInSwitchers = false,
//     IsAlwaysOnTop = true,
// };

// After
public static WindowSpec Tools { get; } = new()
{
    Title = "Tools",
    ResizeMode = WindowResizeMode.NoResize,
    ShowInTaskbar = false,
    ShowInSwitcher = false,
    Level = WindowLevel.AlwaysOnTop,
};
// Before
// new WindowSpec
// {
//     Title = "Main",
//     PersistenceId = "main",
//     StartPosition = WindowStartPosition.RestoreFromPersistence,
// };

// After
public static WindowSpec Main { get; } =
    new WindowSpec { Title = "Main" }.WithPersistence("main");

WindowPlacementCodec 只存储显示器指纹与 WINDOWPLACEMENT, 不存储 WindowStartPosition,因此无需对磁盘上的摆放数据做迁移。

后续阅读

  • 窗口 —— 054 之后的完整窗口 API:尺寸、摆放、Z 序、标题栏与外壳、任务栏、显示器。
  • 高级窗口特性 —— 有意脱离 WindowSpec 契约的重互操作范例。
  • 持久化 —— 窗口摆放之外的持久化作用域。