组件
菜单
从触发器打开的菜单、上下文菜单及其条目。
ui.Menu 从一个按钮打开 ui.MenuItem:显示在按钮旁边,或在设置 Presentation: base.PresentSheet 时从底部显示为 sheet,与设备无关。ui.ContextMenu 在指针处打开同样的条目。
ui.Menu{Trigger: ui.Button{Text: "操作", Variant: ui.ButtonSecondary}, Children: []core.Node{
ui.MenuItem{Text: "重命名", Icon: lucide.Pencil, OnSelect: rename},
ui.MenuItem{Text: "复制一份", Shortcut: "mod+d", OnSelect: duplicate},
ui.MenuSeparator{},
ui.MenuItem{Text: "删除", Variant: ui.MenuItemDanger, OnSelect: remove},
}}
菜单自己打开和关闭;Open 和 OnOpenChange 让应用保存它的状态。Trigger 是按钮的外观和内容,按压由菜单接管。弹出层不会超出触发器旁的空间:它在能完整放下的一侧打开,条目超出该空间或 MaxHeight 后滚动。
条目
ui.MenuItem 显示 Text、可选的 Icon 和 Shortcut(写作 "mod+c",在弹出层中按平台的方式显示),并报告 OnSelect,除非设置 NoCloseOnSelect,否则选择后菜单关闭。Disabled 禁用它,Checked 在旁边显示勾选,Variant: ui.MenuItemDanger 标记危险操作。ui.MenuLabel 作为一组的标题,ui.MenuSeparator 分隔各组。ui.Submenu 包含更多条目,在条目旁边打开,在 sheet 中则替换周围的条目。
ui.Menu{Trigger: ui.Button{Text: "显示", Variant: ui.ButtonGhost}, Children: []core.Node{
ui.MenuLabel{Text: "排序方式"},
ui.MenuItem{Text: "名称", Checked: func() bool { return sort.Get() == "name" }, OnSelect: func() { sort.Set("name") }},
ui.MenuItem{Text: "日期", Checked: func() bool { return sort.Get() == "date" }, OnSelect: func() { sort.Set("date") }},
ui.MenuSeparator{},
ui.Submenu{Text: "分享", Children: []core.Node{
ui.MenuItem{Text: "复制链接", OnSelect: copyLink},
ui.MenuItem{Text: "邮件", OnSelect: emailLink},
}},
}}
上下文菜单
ui.ContextMenu 在次级点击或触摸屏上的长按时,于指针处打开 Trigger 的条目。
ui.ContextMenu{Trigger: fileRow, Children: []core.Node{
ui.MenuItem{Text: "打开", OnSelect: open},
ui.MenuItem{Text: "删除", Variant: ui.MenuItemDanger, OnSelect: remove},
}}
行为
Escape、返回和点击外部会关闭菜单。菜单是由 Placement 和 Align 定位的弹出层,按要求呈现时则是从底部弹出的 sheet。在桌面上,下、上、Home、End、Page Down 和 Page Up 在可用条目间移动,从指针所在的条目开始,右键打开子菜单、左键关闭,回车选择。用键盘打开的菜单会聚焦第一个条目,菜单关闭时焦点回到触发器。
无障碍
菜单报告 RoleMenu,每个条目报告 RoleMenuItem。触发器的内容不足以说明时,用 Label 命名。读屏器读出条目的文字以及它是否被禁用。
平台
触发器和条目属于应用;sheet、弹出层、焦点、Escape 和返回属于平台。弹出层还是 sheet 由应用选择,NSGo 不按设备决定。