尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Terminal.Gui 导航系统深入解析:焦点管理、Tab 遍历与键盘/鼠标导航实战指南

发布时间:2026/9/23 23:40:00

资讯中心
01
ARTICLE

Terminal.Gui 导航系统深入解析:焦点管理、Tab 遍历与键盘/鼠标导航实战指南

Terminal.Gui 导航系统深入解析:焦点管理、Tab 遍历与键盘/鼠标导航实战指南
UI组件跨平台桌面应用【免费下载链接】Terminal.GuiCross Platform Terminal UI toolkit for .NET项目地址https://gitcode.com/gh_mirrors/te/Terminal.Gui点击查看免费下载导读本文全面剖析 Terminal.Gui跨平台 .NET 终端 UI 工具包的导航Navigation系统它决定了应用中哪一个元素接收键盘与鼠标输入即谁拥有焦点、用户如何切换焦点、键盘遍历 UI 元素的顺序以及 Tab、F6、方向键、HotKey、鼠标点击等标准输入在默认情况下的行为。读完本文你将掌握焦点链Focus Chain的完整模型、TabBehavior四种取值的使用场景、Application.Navigation的全局焦点 API并能通过SetFocus()、AdvanceFocus()与HasFocusChanging/HasFocusChanged事件构建可键盘直达、无障碍友好的终端界面。文中所有结论均以当前仓库源码navigation.md、ApplicationNavigation.cs、TabBehavior.cs 等为依据。阅读前置建议先通读 Keyboard Deep Dive 与 Lexicon Taxonomy它们与本文共享大量概念有关光标显示的内容请参见 Cursor Management。导航系统回答的核心问题Terminal.Gui 的导航系统本质上要回答六类问题理解它们有助于把握整个导航架构的边界视觉线索哪些视觉元素帮助用户判断哪个控件正在接收键盘/鼠标输入即谁有焦点焦点切换用户如何改变应用中拥有焦点的控件导航线索哪些视觉元素提示用户什么按键会改变焦点动作线索哪些视觉元素提示用户什么按键会在未聚焦的控件上触发动作如 HotKey遍历顺序使用键盘导航时UI 元素按什么顺序被遍历默认动作标准按键/鼠标输入HotKey、Space、Enter、鼠标单击的默认行为是什么术语表Lexicon Taxonomy先统一术语后续章节会反复使用完整术语表见 navigation-lexicon.md术语含义Cursor指示键盘输入将作用于何处的视觉标记。每个终端会话只有一个 Cursor详见 Cursor。Focus某个 UI 元素View被选中并准备接收用户输入的状态。Focus Chain焦点链从当前聚焦元素向上延伸到根视图Application.Top的有序序列。一个应用中同一时刻只有一条焦点链处于激活状态top.HasFocus true且链中恰好只有一个View 是最聚焦most-focused的——即实际接收键盘输入的那个。Tab既可指键盘上的Tab键也可指键盘导航中的一个停靠点stop-point。TabStop一个终极停靠点自身没有可聚焦子视图的 View。Command.NextTabStop/PreviousTabStop的默认键是Key.Tab/Key.Tab.WithShift见Application.DefaultKeyBindings且只在同级兄弟视图peer-views之间导航。TabGroup一个可聚焦子视图的容器 View。Command.NextTabGroup/PreviousTabGroup的默认键为Key.F6/Key.F6.WithShift用于在视图层级中上下导航。Enter / GainView 从未聚焦变为获得焦点v1 遗留术语等价于gaining focus。Leave / LoseView 从已聚焦变为失去焦点v1 遗留术语等价于losing focus。导航设计原则TenetsTerminal.Gui v2 的导航设计遵循四条原则优先级自上而下递减键盘相关的原则同时参考 Keyboard Deep Dive每应用仅一个焦点One Focus Per App不可能存在两个视图同时是最聚焦视图。应用中始终有且仅有一个视图作为键盘输入的目标。键盘永远可达Theres Always a Way With The Keyboard框架确保只用键盘也能访问应用的任何元素。例如仓库中的单元测试AllViews_AtLeastOneNavKey_Advances见 AllViewsNavigationTests.cs遍历所有内置 View断言每个可聚焦的内置 View 都至少有一个能推进焦点的导航键。另一个保证是只要定义了 HotKey 的 View 可见且启用无论视图层级如何按下该热键就会触发其动作默认同时聚焦该 View。灵活覆写Flexible Overrides焦点行为可以在代码中灵活改变。例如将View.CanFocus设为false可阻止视图获得焦点或覆写OnHasFocusChanging返回true取消焦点变更。概念解耦Decouple Conceptsv1 中CanFocus与HasFocus、TabIndex、TabIndexes、TabStop强耦合存在大量自动同步的魔法逻辑导致 API 脆弱难测。v2 将这些概念解耦例如CanFocus true的视图可以设置TabStop NoStop仍可通过鼠标获得焦点。回答导航关键问题视觉线索与焦点切换焦点视觉线索当前焦点指示拥有焦点的视图使用其ColorScheme.Focus属性渲染焦点链中最深的视图最聚焦可通过View.Cursor显示终端光标焦点链上的祖先视图聚焦视图的 SuperView 们同样使用聚焦样式整个终端同一时刻只显示一个光标由Application.NavigationApplicationNavigation.cs统一管理。导航线索HotKey 通过在Label、Button、MenuItem等控件中以下划线标注字符来提示如E_xit中的xTab 顺序在容器内一般为从左到右、从上到下焦点指示器如高亮矩形显示哪个视图将接收输入。提示关于视图如何控制光标位置与样式参见 Cursor Management。改变焦点的方式键盘方式按键行为Tab/ShiftTab在 TabStop 视图之间导航F6/ShiftF6在 TabGroup 容器之间导航方向键在容器内导航或移动到相邻视图HotKeyAlt字母直接导航到特定视图Enter/Space激活当前聚焦的视图鼠标方式单击任何可聚焦视图即可让其获得焦点焦点行为取决于该视图之前是否被聚焦过见下文RestoreFocus 与 AdvanceFocus小节。导航遍历顺序视图按其TabStop行为与在视图层级中的位置被遍历TabStop 视图用Tab/ShiftTab按布局顺序导航TabGroup 视图容器用F6/ShiftF6导航NoStop 视图键盘导航时跳过但可被鼠标聚焦。键盘导航详解Terminal.Gui 导航系统的绝大部分工作都围绕让用户能用键盘导航视图展开。系统定义的导航键如下均以KeyBindingScope.Application作用域注册见 Application.cs 中的DefaultKeyBindingsCommand默认键行为Command.NextTabStopKey.Tab导航到下一个TabStop子视图若无则聚焦第一个TabStop子视图Command.PreviousTabStopKey.Tab.WithShift与NextTabStop相反—Key.CursorRight/Key.CursorDown行为与NextTabStop完全相同—Key.CursorLeft/Key.CursorUp行为与PreviousTabStop完全相同Command.NextTabGroupKey.F6导航到视图层级中下一个TabGroup若无则聚焦第一个TabGroupCommand.PreviousTabGroupKey.F6.WithShift与NextTabGroup相反F6的选择沿用了 Windows 通用键盘加速键约定。这些键由Application注册为**应用作用域KeyBindingScope.Application**的键绑定。由于应用作用域的键绑定优先级最低视图可以覆写这些键的默认行为——典型例子是Editor视图默认覆写了Key.Tab让用户能在文本中直接输入\t见 TextView.Commands.cs 中KeyBindings.Add (Key.Tab, Command.NextTabStop)的注册方式。仓库中的AllViews_AtLeastOneNavKey_Advances单元测试保证所有内置视图至少有一个能推进焦点的导航键。补充在仓库当前的DefaultKeyBindings定义中Application.csNextTabStop/PreviousTabStop确实绑定到Key.Tab/Key.Tab.WithShiftNextTabGroup/PreviousTabGroup绑定到Key.F6/Key.F6.WithShift与文档描述一致而术语表 navigation-lexicon.md 中提示的CtrlPageDown/CtrlPageUp属于该术语定义的历史说明实际按键以DefaultKeyBindings为准且这些默认值可通过Application.SetDefaultKeyBinding自定义。导航示例代码// 基础焦点管理 var button new Button() { Text Click Me, CanFocus true, TabStop TabBehavior.TabStop }; var textField new TextField() { Text , CanFocus true, TabStop TabBehavior.TabStop }; // 带分组导航的容器 var frameView new FrameView() { Title Options, CanFocus true, TabStop TabBehavior.TabGroup }; // 程序化焦点控制 button.SetFocus(); // 给特定视图焦点 Application.Navigation.AdvanceFocus(NavigationDirection.Forward, TabBehavior.TabStop);HotKey跨层级直达HotKey 是键盘导航的快捷键机制详见 Keyboard Deep Dive。View.HotKey可以在整个应用的视图层级间导航且独立于焦点工作——即使某个视图当前未聚焦按下其热键也能直接触发动作并默认聚焦它。这在复杂的嵌套子视图包括重叠窗口场景中非常有用AllViewsTester场景AllViewsTester.cs就是一个典型例子。HotKey 通过View.HotKey属性定义用Alt指定键激活var saveButton new Button() { Text Strings.cmdSave, HotKey Key.S }; var exitButton new Button() { Text E_xit, HotKey Key.X }; // AltS 激活保存AltX 激活退出与当前焦点无关此外应用中多个视图甚至同一 SuperView 内可以拥有相同的 HotKey。鼠标导航详解鼠标导航比键盘简单得多如果视图可聚焦用户点击它即可获得焦点。但有两个值得注意的细节一个可聚焦的 View 带有可聚焦子视图时用户点击其 Border哪个子视图如果有会获得焦点同样情况下用户点击其 ContentArea哪个子视图如果有会获得焦点两个问题的答案一致取决于该 View之前是否被聚焦过若 View 之前曾被聚焦系统会记录之前最聚焦的子视图并通过RestoreFocus()恢复到该子视图若 View 之前未被聚焦则调用AdvanceFocus()查找下一个合适的焦点目标。为保证上述机制正确框架必须包含相应逻辑一旦此前可聚焦的视图变得不可聚焦例如Visible发生变化就要清除RestoreFocus()使用的焦点缓存。鼠标焦点示例// 鼠标点击行为 view.MouseEvent (sender, e) { if (e.Flags.HasFlag(MouseFlags.LeftButtonClicked) view.CanFocus) { view.SetFocus(); e.Handled true; } }; // 鼠标悬停聚焦可选行为 view.MouseEnter (sender, e) { if (view.CanFocus focusOnHover) { view.SetFocus(); } };应用级导航Application.Navigation应用层的导航被封装在ApplicationNavigation辅助类中ApplicationNavigation.cs通过Application.Navigation属性公开访问。该类的核心 API 与内部职责如下获取最聚焦视图ApplicationNavigation.GetFocused()返回应用中最聚焦焦点链最深的视图若没有视图拥有焦点极其罕见的情况则返回null。它替代了 v1 的View.MostFocused。var focused Application.Navigation.GetFocused();全局焦点事件FocusedChanged应用中最聚焦视图已改变时触发。适合想对最聚焦视图做处理的应用例如AdornmentsEditor场景见 Adornments.cs。FocusedChanging应用中最聚焦视图正在改变时触发。适合想在整个应用范围内限制哪些视图可以被聚焦的应用。从源码看ApplicationNavigation.csSetFocused()内部在焦点变更时还会处理鼠标抓取若旧焦点视图被App.Mouse抓取则调用UngrabMouse()并通知驱动SetCursorNeedsUpdate(true)以刷新光标。程序化推进焦点ApplicationNavigation.AdvanceFocus()使焦点向前/向后推进到应用视图层级中的下一个视图并以behavior作为过滤条件。其实现极为简洁return App?.TopRunnableView is { } App.TopRunnableView.AdvanceFocus (direction, behavior);仓库当前实现还会先检查活动 Popover——若存在可见的GetActivePopover()则将焦点推进委托给该 Popover见 ApplicationNavigation.cs。该方法由app.Init()期间创建的应用作用域键绑定所绑定的Command处理器调用作为便利它是public的。注意在视图内部访问时应使用App?.Current而非已过时的Application.TopRunnable。在 v1 中这一方法的功能分散在Application与Runnable中的十余个函数里v2 将其收敛为单一 API。终端光标管理ApplicationNavigation还负责管理终端光标。每个主循环迭代都会调用UpdateCursor()源码见 ApplicationNavigation.cs其流程为通过GetCursorNeedsUpdate()检查是否需要更新光标性能优化避免每帧重绘获取最聚焦视图的Cursor属性验证光标位置位于所有祖先 viewport 边界内从最聚焦视图逐级向SuperView上溯检查通过SetCursor()委托给驱动。光标只为最聚焦的视图焦点链最深者显示焦点变化时光标自动更新为新视图的光标状态。视图通过View.Cursor属性控制光标而非直接操作ApplicationNavigation。说明视图如何设置光标位置与样式的完整细节参见 Cursor Management。应用级导航示例var app Application.Create(); app.Init(); // 监听全局焦点变化 app.Navigation.FocusedChanged (sender, e) { var focused app.Navigation.GetFocused(); StatusBar.Text $Focused: {focused?.GetType().Name ?? None}; }; // 阻止特定视图获得焦点 app.Navigation.FocusedChanging (sender, e) { if (e.NewView is SomeRestrictedView) { e.Cancel true; // 取消焦点变更 } }; // 程序化导航 Application.Navigation.AdvanceFocus(NavigationDirection.Forward, TabBehavior.TabStop); Application.Navigation.AdvanceFocus(NavigationDirection.Backward, TabBehavior.TabGroup);NavigationDirection枚举只有两个取值Forward与Backward见 NavigationDirection.cs。视图级导航View 上的焦点 APIAdvanceFocus()是开发者让一个View获得或失去焦点的核心方法View.Navigation.cs。其递归算法从源码可以概括为先检查自身CanBeVisible触发AdvancingFocus事件RaiseAdvancingFocus若被处理则返回若当前Focused子视图存在先尝试让子视图推进焦点递归下探若子视图无法推进则基于方向与行为构建焦点链GetFocusChain(direction, behavior)并在链中寻找下一个候选TabGroup行为在到达链顶时还有特殊的回绕逻辑。视图的焦点变化会触发一系列事件例如HasFocusChanging与HasFocusChanged事件签名与触发顺序见 View.Navigation.cs。视图焦点管理示例// 基础焦点控制 public class CustomView : View { protected override void OnHasFocusChanging(CancelEventArgsbool e) { if (SomeCondition) { e.Cancel true; // 阻止焦点变更 return; } base.OnHasFocusChanging(e); } protected override void OnHasFocusChanged(EventArgsbool e) { if (e.CurrentValue) { // 视图获得了焦点 UpdateAppearance(); } base.OnHasFocusChanged(e); } }什么让一个 View 可聚焦首先只有Visible与Enabled都为true的视图才能获得焦点。在此基础上CanFocus决定视图是否可聚焦——CanFocus必须为true。但即便CanFocus true其他因素仍可能阻止视图获得焦点。一个可见 启用 CanFocus true的视图可以通过鼠标点击或代码显式调用SetFocus()获得焦点当然视图自身或其他代码可通过覆写OnHasFocusChanging取消。对于键盘导航TabStop属性是从当前最聚焦视图出发的过滤器TabStop对鼠标导航没有影响。TabStop的类型为TabBehavior枚举源码见 TabBehavior.cs。TabBehavior 取值详解值含义null视图仍在初始化中作为信号让set_CanFocus自动将TabStop设为TabStop为最常见用例提供便利。在判断视图是否可被键盘聚焦时等价于NoStop。NoStop阻止用户通过键盘导航让该视图及其子视图获得焦点。注意视图仍可通过代码或鼠标获得焦点。TabStop表示该视图是可聚焦视图且没有可聚焦子视图。NextTabStop/PreviousTabStop键只在兄弟视图SuperView.SubViews之间推进。TabGroup表示该视图是其他可聚焦视图的容器支持跨容器键盘导航适用于平铺tiled与重叠overlapped两种场景。例如FrameView是平铺场景的可见容器其TabStop设为TabGroupArrangement为ViewArrangement.FixedWindow是重叠场景的可见容器其TabStop设为TabGroupArrangement为ViewArrangement.Movable | Resizable | Overlapped。NextTabGroup/PreviousTabGroup键会在应用中所有TabGroup视图之间推进除非被NoStop的祖先视图阻断。需要说明TabBehavior枚举的 XML 文档中TabGroup项仍写着NextTabGroup 键为CtrlPageDown的示例文本见 TabBehavior.cs但仓库当前Application.DefaultKeyBindings实际绑定的是Key.F6Application.cs实际按键请以后者为准且可通过Application.SetDefaultKeyBinding覆盖。可聚焦条件总结一个视图可聚焦需要满足VisibletrueEnabledtrueCanFocustrueTabStop!NoStop仅键盘导航需要// 示例让一个视图可聚焦 var view new Label() { Text Focusable Label, Visible true, // 必须可见 Enabled true, // 必须启用 CanFocus true, // 必须可聚焦 TabStop TabBehavior.TabStop // 可键盘导航 };如何判断视图是否有焦点哪个是最聚焦视图View.HasFocus指示该视图是否聚焦是权威信号。若视图没有可聚焦子视图则该属性同时表明它是应用中最聚焦的视图。将HasFocus设为true与调用SetFocus()效果相同——也意味着焦点可能不会真的改变。如果v.HasFocus true则v的 SuperView 层级上所有视图都必须是可聚焦的v的 SuperView 层级上所有视图的HasFocus也均为truev中最深的可聚焦子视图HasFocus也为true。换言之v.HasFocus true并不一定意味着v是最聚焦、正在接收输入的视图。若它有可聚焦子视图那么其中一个或更深层的子视图才是最聚焦的即Application.Navigation.GetFocused()的返回值。从源码看private bool _hasFocus字段是View.HasFocus的后备存储是视图是否有焦点的终极事实来源相关事件与字段实现见 View.Navigation.cs。焦点链示例// 层级Window - Dialog - Button // 如果 Button 有焦点则 window.HasFocus true // 焦点链的一部分 dialog.HasFocus true // 焦点链的一部分 button.HasFocus true // 真正被聚焦 // Application.Navigation.GetFocused() 返回 button var mostFocused Application.Navigation.GetFocused(); // 返回 button用户如何感知焦点简言之ColorScheme.Focus。焦点链上的视图使用聚焦颜色渲染提供应用的哪部分处于活动状态的视觉反馈。// 自定义焦点样式 protected override void OnDrawContent(Rectangle viewport) { var attribute HasFocus ? GetFocusColor() : GetNormalColor(); Driver.SetAttribute(attribute); // ... 绘制内容 }如何让一个视图获得焦点开发者让视图获得焦点的核心 public 方法是SetFocus()签名见 View.Navigation.cs。与 v1 不同v2 中该方法在焦点变更未发生时例如视图不可聚焦、或焦点变更被取消返回false// 程序化焦点控制 if (myButton.SetFocus()) { Console.WriteLine(Button now has focus); } else { Console.WriteLine(Could not focus button); } // 备选设置 HasFocus 属性效果相同 myButton.HasFocus true;如何让一个视图失去焦点让视图失去焦点的典型方式是让另一个视图获得焦点// 聚焦其他视图从而移除当前视图的焦点 otherView.SetFocus(); // 或程序化推进焦点 Application.Navigation.AdvanceFocus(NavigationDirection.Forward, TabBehavior.TabStop); // 视图变为不可聚焦时也会失去焦点 myView.CanFocus false; // 若有焦点则会失去 myView.Visible false; // 若有焦点则会失去 myView.Enabled false; // 若有焦点则会失去确定最聚焦的子视图v1 中View.MostFocused会沿视图层级向上遍历返回最后一个HasFocus true的视图。v2 中Application.Navigation.GetFocused()提供相同功能且开销更小// v2 获取最聚焦视图的方式 var focused Application.Navigation.GetFocused(); // 替代 v1 的写法 // var focused Application.TopRunnable.MostFocused;View.Add/Remove对焦点的影响v1 中调用super.Add(view)时若view.CanFocus true会导致层级中所有 SuperView 的CanFocus也被自动设为true同时 v1 会在view.CanFocus true时自动设置TabStop。v2 的规则明显简化开发者必须显式设置视图层级中任何希望获得焦点的视图的CanFocusv2保留了Add自动设置TabStop的行为因为它不复杂且免去开发者同时设置TabStop与CanFocus的麻烦注意如果TabStop被改变v2不会自动改变CanFocus。// v2 显式焦点设置 var container new FrameView() { Title Container, CanFocus true, // 必须显式设置 TabStop TabBehavior.TabGroup }; var button new Button() { Text Click Me, CanFocus true, // 必须显式设置 TabStop TabBehavior.TabStop // Add() 会自动设置但可以覆盖 }; container.Add(button); // 不会自动给 container 设置 CanFocus监听视图焦点变化HasFocusChanging与HasFocusChanged在视图焦点变化时触发// 监听焦点变化 view.HasFocusChanging (sender, e) { if (e.NewValue !ValidateCanFocus()) { e.Cancel true; // 阻止获得焦点 } }; view.HasFocusChanged (sender, e) { if (e.CurrentValue) { OnViewGainedFocus(); } else { OnViewLostFocus(); } };内置视图的交互性速查表下表总结了内置视图对各种输入方式的响应表格图例见后文ViewStatesStaticDefaultHotKeysActivate CmdAccept CmdHotKey CmdClick FocusDblClickRightClickGrabMouseView基类1YesNo1OnSelectOnAcceptFocusFocus--NoLabel1YesNo1OnSelectOnAcceptFocusNextFocus-FocusNextNoButton1NoYes1OnSelectFocusOnAcceptFocusOnAcceptHotKey-SelectNoCheckBox3NoNo1OnSelectAdvanceOnAcceptOnAcceptSelect-SelectNoOptionSelector1NoNo2AdvanceSetValueOnAcceptFocusSetValueSetFocusSetCursor-SetFocusSetCursorNoLinearRange1NoNo1SetFocusedOptionSetFocusedOptionOnAcceptFocusSetFocusSetOption-SetFocusSetOptionYesListView1NoNo1MarkUnMarkRowOpenSelectedOnAcceptOnAcceptSetMarkOnSelectedChangedOpenSelectedOnAccept-NoTextField1NoNo1-OnAcceptFocusFocusSelectAllContextMenuNoEditor1NoNo1-OnAcceptFocusFocus-ContextMenuYes表格图例States视图可拥有的视觉/功能状态数量Static视图是否主要用于展示不可交互Default视图能否成为默认按钮通过 Enter 激活HotKeys视图通常支持的 HotKey 数量Activate Cmd调用Command.Activate时的行为Accept Cmd调用Command.Accept时的行为HotKey Cmd按下视图 HotKey 时的行为Click Focus点击时的行为若CanFocus trueDblClick双击时的行为RightClick右键点击时的行为GrabMouse视图是否捕获鼠标以进行拖拽操作。常见导航模式对话框导航var dialog new Dialog() { Title Settings, CanFocus true, TabStop TabBehavior.TabGroup }; var okButton new Button() { Text OK, IsDefault true }; var cancelButton new Button() { Text Cancel }; // Tab 在按钮间导航Enter 激活默认按钮 dialog.Add(okButton, cancelButton);容器导航var leftPanel new FrameView() { Title Options, TabStop TabBehavior.TabGroup, X 0, Width Dim.Percent(50) }; var rightPanel new FrameView() { Title Preview, TabStop TabBehavior.TabGroup, X Pos.Right(leftPanel), Width Dim.Fill() }; // F6 在面板之间导航Tab 在面板内部导航列表导航var listView new ListView() { CanFocus true, TabStop TabBehavior.TabStop }; // 方向键在条目间移动Enter 选择Space 切换 listView.KeyBindings.Add(Key.CursorUp, Command.Up); listView.KeyBindings.Add(Key.CursorDown, Command.Down); listView.KeyBindings.Add(Key.Enter, Command.Accept);无障碍Accessibility考量Terminal.Gui 的导航系统从设计之初就考虑无障碍键盘无障碍所有功能必须可通过键盘访问Tab 顺序应逻辑清晰、可预测HotKey 提供到达重要功能的直接途径方向键在控件内提供细粒度导航。视觉无障碍焦点指示器必须清晰可见颜色不是焦点状态的唯一指示即不能仅靠颜色区分焦点文本与背景对比度符合无障碍标准HotKey 以视觉方式标注下划线字符。屏幕阅读器支持焦点变化通过系统事件播报视图标题与标签提供上下文状态信息可以程序化获取。无障碍导航最佳实践// 提供有意义的标签 var button new Button() { Text _Save Document, HotKey Key.S }; // 设置逻辑 Tab 顺序 container.TabStop TabBehavior.TabGroup; foreach (var view in container.Subviews) { view.TabStop TabBehavior.TabStop; } // 为鼠标动作提供键盘替代方案 view.KeyBindings.Add(Key.F10, Command.Context); // 右键的键盘等价物 view.KeyBindings.Add(Key.Space, Command.Activate); // 点击的键盘等价物延伸阅读Keyboard Deep Dive — HotKey、按键绑定与键盘事件深入Mouse Deep Dive — 鼠标事件、点击与拖拽语义Cursor Management — 视图如何控制光标位置与样式Lexicon Taxonomy — 术语与分类体系相关源码ApplicationNavigation.cs、View.Navigation.cs、TabBehavior.cs、Application.cs相关测试AllViewsNavigationTests.cs交互示例AllViewsTester.cs、Adornments.cs。无障碍标准的行业参考外部链接仅供背景了解WCAG 快速参考、Microsoft 无障碍指南、.NET 无障碍文档。赞分享UI组件跨平台桌面应用【免费下载链接】Terminal.GuiCross Platform Terminal UI toolkit for .NET项目地址https://gitcode.com/gh_mirrors/te/Terminal.Gui点击查看免费下载相关推荐Terminal.Gui 导航术语表Navigation Lexicon焦点、焦点链与 Tab 导航体系完全指南Terminal.Gui 导航术语表Navigation Lexicon焦点、焦点链与 Tab 导航体系完全指南 导读 本文以 Terminal.GuiUI组件跨平台桌面应用BrowserSkill human-loop实现详解request-help从发出到用户接管的完整链路BrowserSkill human loop实现详解request help从发出到用户接管的完整链路 BrowserSkill 让 AI Agent 使用人工智能AI 应用AI 技能浏览器控制dsh-pluginOpCore-Simplify15分钟搞定黑苹果配置告别48小时手动折腾OpCore Simplify15分钟搞定黑苹果配置告别48小时手动折腾 你是否曾被黑苹果复杂的配置流程劝退是否因为ACPI补丁、内核扩展、硬件兼容性等问开发工具CLI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。