ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Terminal.Gui 事件术语体系详解:从 Event、Bubble 到 CommandRouting 的统一词汇表

Terminal.Gui 事件术语体系详解:从 Event、Bubble 到 CommandRouting 的统一词汇表 UI组件跨平台桌面应用【免费下载链接】Terminal.GuiCross Platform Terminal UI toolkit for .NET项目地址https://gitcode.com/gh_mirrors/te/Terminal.Gui点击查看免费下载Terminal.Gui 的事件系统横跨Cancellable Work Pattern可取消工作模式CWP、Command 命令系统与视图绘制、键盘、鼠标等众多子系统因此官方维护了一份精确定义的事件词表Events Lexicon统一了Event、Raise、Bubble、Dispatch、Bridge等 18 个核心术语的含义。本文以该词表为骨架逐条解释每个术语在框架中的确切含义与源码对应实现帮助读者在阅读 事件深度指南、命令深度指南 和 CWP 概念文档 时使用同一种语言沟通。这份词表由仓库中的 docfx/includes/events-lexicon.md 定义并被 docfx/docs/events.md、docfx/docs/cancellable-work-pattern.md 和总词表 docfx/docs/lexicon.md 共同引用。读完本文你将能准确区分事件向上 Bubble 还是向下 DispatchBridge 与 SuperView 关系有何不同Handled与Cancel各自适用什么场景等关键概念。这套词表服务于哪三个体系在深入词条之前先明确这套术语的三块应用土壤它们共同构成了 Terminal.Gui 的事件世界观Cancellable Work PatternCWP一种默认执行 外部定制 可取消的工作流模式以事件为主、虚方法为辅。词表中的Cancel、Cancellation、Context、Default Behavior、Notifications、Workflow均直接源于该模式概念性定义见 cancellable-work-pattern.md。Command 命令系统用Command枚举作为用户操作的标准化词汇Activate、Accept、HotKey、Cut、Paste、Save等 50 余个并借助CommandRouting在视图层级中传播。词表中的Command、Dispatch、Bubble、Bridge、Routing全部属于这一体系详见 command.md。视图核心流程绘制View.Draw、键盘View.Keyboard、命令View.Command等内置工作流是 CWP 在框架中的具体应用词表中的Event、Listen、Invoke、Raise、Handle贯穿其间。换句话说CWP 定义了何时通知、如何取消Command 体系定义了通知什么、往哪个方向走而词表统一了两者的话语体系。通知的基础四词Event / Listen / Invoke / Raise事件机制的本质是观察者模式一个对象在感兴趣的事情发生时通知其他对象。词表用四个词精确区分了这一流程的不同环节术语含义Event一种通知机制允许对象在感兴趣的事情发生时相互通信。Terminal.Gui 在 UI 交互中大量使用事件。Listen订阅或注册某个事件以接收通知的行为。Invoke调用或触发一个事件、Action 或方法的行为。Raise触发事件、通知所有已注册的事件处理器事件已发生的行为。在代码层面这四个词的对应关系非常清晰Event即字段形式的event EventHandlerTEventArgs?声明例如View上的Accepting/Activated、Slider的OrientationChangingListen即订阅例如button.Accepted (_, _) DoTheThing ();Invoke指框架内部主动调用处理逻辑例如View.InvokeCommand (Command.Activate)Raise指RaiseActivating/RaiseActivated这类专门负责触发事件的方法词表在Notifications与Default Behavior条目中将其与虚方法并列见下文。一个值得注意的实现约定见 events.md 的 Recipe 3虚方法默认必须是无操作no-op事件触发必须发生在独立的Raise*方法中而不是虚方法内部。正确的顺序永远是先调用虚方法子类优先→ 再触发事件外部订阅者→ 最后执行默认行为。反馈与干预Handle、Cancel 与 Cancellation事件不仅用于通知还用于干预。词表用Handle和Cancel两个家族区分两种不同的干预语义术语含义Handle/Handling/Handled适用于事件可以由监听者或重写处理也可以不处理的场景。典型例子是源于用户操作的事件如鼠标移动和按键。Cancel/Cancelling/Cancelled适用于某些事情可以被取消的场景例如改变Slider的Orientation。Cancellation用于中止某个阶段或工作流的机制例如在事件参数中设置Cancel/Handled属性或从虚方法返回bool。两者的边界在 cancellable-work-pattern.md 中有更细的刻画输入类事件InputEventArgs惯用Handled而独立的可取消工作流如属性变更惯用Cancel。不过在 Terminal.Gui 的 CWP 实现中框架统一以Handled作为取消标志——events.md 的Common Pitfalls专门强调ValueChangingEventArgs没有Cancel属性args.Cancel true是错误用法必须写args.Handled true。从源码可以印证这一设计。CWP 的取消判定在 CWPPropertyHelper.cs 中表现为两条链onChanging 虚方法返回 true 或 args.Handled true → 取消 changingEvent?.Invoke 后 args.Handled true → 取消而 CWPWorkflowHelper.cs 的ExecuteT同样以onMethod(args) || args.Handled作为已处理的判定起点。也就是说框架层把处理与取消统一收敛到Handled一个布尔开关上词表将它们分开列出是为了帮助读者理解语义来源而落地编码时只需记住Handled。干预的载体Context 与 Default BehaviorHandle/Cancel回答能否干预Context与Default Behavior则回答干预时看到什么、不干预时发生什么术语含义Context传递给观察者用于决策的数据例如绘制用的DrawContext、键盘用的Key、命令用的ICommandContext以及方向变更用的CancelEventArgsOrientation。Default Behavior每个阶段的标准实现例如绘制的DrawText、键盘与应用级的InvokeCommands、命令的RaiseActivating以及属性更新OrientationHelper。Context命令上下文ICommandContext词表明确点名了ICommandContext这是 Command 体系中最重要的上下文对象定义于 ICommandContext.cspublic interface ICommandContext { Command Command { get; } // 正在调用的命令 WeakReferenceView? Source { get; } // 指向命令发起视图的弱引用 ICommandBinding? Binding { get; } // 触发命令的绑定键/鼠标/编程式 CommandRouting Routing { get; } // Direct / BubblingUp / DispatchingDown / Bridged IReadOnlyListobject? Values { get; } // 命令传播过程中累积的值链 object? Value { get; } // 最近追加的值Values[^1] }两个细节值得注意Source是WeakReferenceView目的是防止命令传播期间因视图被释放而产生内存泄漏。安全访问方式是args.Context?.Source?.TryGetTarget (out View? view)。Values是一条只追加的值链每个实现了IValue的视图在命令传播时把自己的值追加进来顺序从最内层发起者到最外层。Value只是Values[^1]的便捷访问器。用 LINQ 按类型搜索ctx.Values?.FirstOrDefault (v v is Schemes)是在深层级联中定位具体值的惯用做法。Default BehaviorCWP 的三元结构Default Behavior是 CWP 得以开箱即用的保证。CWP 的核心结构是默认执行 定制 取消三元组即使没有任何外部代码介入每个阶段也有一条标准实现路径保证系统照常运转。在 CWPPropertyHelper.ChangeProperty 中可以看到完整的默认行为链值相等 → 直接返回false无变更onChanging虚方法 changingEvent事件任一取消则返回false非空校验NewValue对非可空引用类型不能为 null否则抛InvalidOperationExceptiondoWork写入后备字段并更新相关状态先做工作、再发 Changed 事件onChanged虚方法 changedEvent事件通知完成。命令传播的四方向Command / Dispatch / Bubble / Bridge / Routing如果说前两节是 CWP 的时间轴阶段先后那么本节是 Command 体系的空间轴传播方向。词表用一组动词精确区分了命令在视图层级中的四种运动方式术语含义Command一种将请求封装为对象的模式允许对请求进行参数化和排队。详见 command.md。Dispatch/Dispatching从 SuperView向下把命令发送到特定 SubView。向下的方向永远是 dispatch绝不叫 bubble。DispatchDown发送时抑制冒泡TryDispatchToTarget借助GetDispatchTarget和ConsumeDispatch为组合视图自动化分发。Bubble/Bubbling命令从 SubView向上传播到其 SuperView。通过CommandsToBubbleUp选择启用。向上的方向永远是 bubble——绝不叫 dispatch。Bridge/Bridging跨非包含边界路由命令例如MenuBarItem↔PopoverMenu。CommandBridge订阅远程视图的完成事件并以CommandRouting.Bridged在所有者上重新触发。RoutingCommandRouting枚举描述命令的路由方式Direct本地调用、BubblingUp向上到 SuperView、DispatchingDown向下到 SubView、Bridged跨非包含边界。由ICommandContext.Routing携带。Routing用一个判别式枚举取代两个布尔标志词表所指的CommandRouting定义于 CommandRouting.cs。从源码注释看它取代了旧的临时布尔标志IsBubblingUp与IsBubblingDown把方向信息收敛为一个判别式discriminated枚举。四种取值与源码注释的对应关系是Direct—— 编程式调用或来自视图自身绑定的调用BubblingUp—— 命令正沿 SuperView 链向上传播DispatchingDown—— SuperView 正向下分发到特定 SubViewBridged—— 命令正通过CommandBridge跨越非包含边界。Bubble通知而非消费Bubble的关键语义是它是通知而非消费SuperView 的返回值会被传播但中继视图无论结果如何都会继续自己的处理。启用方式是在祖先视图上设置CommandsToBubbleUpmyWindow.CommandsToBubbleUp [Command.Activate, Command.Accept];此后窗口内任意 SubView 触发Activate/Accept时myWindow.Activated/Accepted都会收到冒泡事件。框架内常用取值见 command.mdShortcut冒泡[Activate, Accept]Dialog冒泡[Accept]SelectorBase冒泡[Activate, Accept]。Dispatch向下的自动化分发Dispatch服务于组合视图Composite View模式。框架通过三个虚成员实现自动化GetDispatchTarget(ICommandContext?)—— 返回应接收分发的 SubView返回null表示跳过分发ConsumeDispatch—— 控制分发是否消费命令false为中继如Shortcut分发到CommandView后发起者继续自己的激活true为消费如OptionSelector/MenuBar分发后由组合视图自己触发RaiseActivated/RaiseAcceptedDispatchDown(target, ctx)—— 以CommandRouting.DispatchingDown构造上下文并在目标上调用TryBubbleUp检测到该路由会跳过冒泡从而防止无限递归。Bridge跨非包含边界的单向通道Bridge解决的是 SuperView/SubView 树之外的关系。典型场景MenuItem拥有的SubMenuPopoverMenu注册在Application.Popover中并不在 SuperView 层级里命令无法靠 Bubble 传播。此时用 CommandBridge.cs 搭桥CommandBridge bridge CommandBridge.Connect (owner, remote, Command.Accept, Command.Activate); bridge.Dispose (); // 拆除订阅桥的实现要点均可从源码确认订阅远程视图的完成事件Accept→AcceptedActivate→Activated其余命令 →CommandNotBound以CommandRouting.Bridged重新进入完整管道桥调用的是View.InvokeCommand而非RaiseAccepted/RaiseActivated因此会完整走RaiseAccepting/RaiseActivating → TryDispatchToTarget → TryBubbleUp → RaiseAccepted/RaiseActivatedTryDispatchToTarget对Bridged路由有守卫防止桥接命令向下分发到所有者的 CommandView桥是向上带命令不是向下保留Values链Values e.Context?.Values ?? []远程层级累积的值对所有者的订阅者可见两端都是弱引用不会阻止 GC桥是单向的双向路由需要建两座桥。一个必须牢记的桥接限制command.md 以重要提示标注由于桥订阅的是远程视图的事后事件Activated/Accepted远程侧的状态变更已经发生所有者在Activating/Accepting中设置args.Handled true无法撤销远程侧已发生的变更框架会发出BridgedCancellation追踪警告。需要取消语义时应改用直接包含关系SuperView/SubView CommandsToBubbleUp而非桥。Notifications 与 WorkflowCWP 的运转单元最后两个词把 CWP 的阶段和通知概念固定下来术语含义Notifications在每个阶段触发以通知观察者的事件如DrawingText、KeyDown、Activating、OrientationChanging和虚方法如OnDrawingText、OnKeyDown、OnActivating、OnOrientationChanging。WorkflowCWP 中一系列阶段的序列可能是多阶段的如View.Draw中的渲染、线性的如View.Keyboard中的按键处理、按单元执行的如View.Command中的命令执行或事件驱动的如Application.Keyboard的按键处理、OrientationHelper的属性变更。这里体现了 Terminal.Gui 的一个关键设计惯例每个可干预的阶段都成对暴露事件 虚方法。事件面向外部订阅者松耦合虚方法面向子类重写继承式扩展且调用顺序固定为虚方法在前、事件在后保证子类获得第一优先级。命名惯例则完全可由词表的-ing/-ed对推导Actioning为可取消的前置通知Actioned为不可取消的后置通知虚方法对应为OnActioning/OnActioned。Action一词则特指带参数调用但不返回值的委托类型在 Terminal.Gui 中用于简单回调——例如Shortcut.Action在OnActivated中被调用见 command.md 的 Shortcut Dispatch 一节是最轻量的定制点。完整术语表速查以下为 events-lexicon.md 中 18 个术语的完整汇总供日常查阅TermMeaningActionA delegate type that represents a method that can be called with specific parameters but returns no value. Used for simple callbacks in Terminal.Gui.Bridge/BridgingRouting a command across a non-containment boundary (e.g.,MenuBarItem↔PopoverMenu).CommandBridgesubscribes to a remote views completion events and re-raises them on the owner withCommandRouting.Bridged.Bubble/BubblingPropagating a commandupwardfrom a SubView to its SuperView. Opt-in viaCommandsToBubbleUp. The upward direction is always bubble — never dispatch.Cancel/Cancelling/CancelledApplies to scenarios where something can be cancelled. Changing theOrientationof aSlideris cancelable.CancellationMechanisms to halt a phase or workflow in the Cancellable Work Pattern, such as settingCancel/Handledproperties in event arguments or returningboolfrom virtual methods.CommandA pattern that encapsulates a request as an object, allowing for parameterization and queuing of requests.ContextData passed to observers for informed decision-making in the Cancellable Work Pattern, such asDrawContext(drawing),Key(keyboard),ICommandContext(commands), orCancelEventArgsOrientation(orientation).Default BehaviorA standard implementation for each phase in the Cancellable Work Pattern, such asDrawText(drawing),InvokeCommands(keyboard and application-level),RaiseActivating(commands), or updating a property (OrientationHelper).Dispatch/DispatchingSending a commanddownwardfrom a SuperView to a specific SubView. The downward direction is always dispatch — never bubble.DispatchDownsends with bubbling suppressed;TryDispatchToTargetusesGetDispatchTargetandConsumeDispatchto automate dispatch for composite views.EventA notification mechanism that allows objects to communicate when something of interest occurs. Terminal.Gui uses events extensively for UI interactions.Handle/Handling/HandledApplies to scenarios where an event can either be handled by an event listener (or override) vs not handled. Events that originate from a user action like mouse moves and key presses are examples.InvokeThe act of calling or triggering an event, action, or method.ListenThe act of subscribing to or registering for an event to receive notifications when it occurs.NotificationsEvents (e.g.,DrawingText,KeyDown,Activating,OrientationChanging) and virtual methods (e.g.,OnDrawingText,OnKeyDown,OnActivating,OnOrientationChanging) raised at each phase to notify observers in the Cancellable Work Pattern.RaiseThe act of triggering an event, notifying all registered event handlers that the event has occurred.RoutingTheCommandRoutingenum describes how a command is being routed:Direct(local invocation),BubblingUp(upward to SuperView),DispatchingDown(downward to SubView), orBridged(across non-containment boundary). Carried onICommandContext.Routing.WorkflowA sequence of phases in the Cancellable Work Pattern, which may be multi-phase (e.g., rendering inView.Draw), linear (e.g., key processing inView.Keyboard), per-unit (e.g., command execution inView.Command), or event-driven (e.g., key handling inApplication.Keyboard, property changes inOrientationHelper).继续深入相关文档与源码索引掌握词表之后按以下路径深入阅读效果最佳事件深度指南CWP 在 Terminal.Gui 中的具体实现配方——含-ing/-ed事件取舍规则、CWPPropertyHelper/CWPWorkflowHelper四个 Recipe、事件参数类型表、IValueT接口与命令上下文使用示例。命令深度指南Command 路由的完整架构——含命令路由图、DefaultActivateHandler/DefaultAcceptHandler/DefaultHotKeyHandler的逐步流程、Dispatch 与 Bubble 的机制、CommandBridge用法与限制、以及命令路由追踪TraceCategory.Command。CWP 概念文档模式的通用定义、结构组件与操作流程图以及不依赖框架的泛化示例。总词表除 Events 外还收录了 Arrangement、Configuration、Drawing、Layout、Navigation、Scrolling 六类词表是浏览整个框架术语的统一入口。源码层面的关键落点均已在前文引用CommandRouting.cs、ICommandContext.cs、CommandBridge.cs、CWPPropertyHelper.cs、CWPWorkflowHelper.cs、ValueChangingEventArgs.cs、ValueChangedEventArgs.cs、ResultEventArgs.cs、CancelEventArgs.cs。对照词表阅读这些文件即可在几分钟内建立对 Terminal.Gui 事件系统一词一实现的完整认知。赞分享UI组件跨平台桌面应用【免费下载链接】Terminal.GuiCross Platform Terminal UI toolkit for .NET项目地址https://gitcode.com/gh_mirrors/te/Terminal.Gui点击查看免费下载相关推荐N_m3u8DL-RE 实操教程一条命令搞定 m3u8 下载7 个关键命令从安装到直播定时录制N_m3u8DL RE 实操教程一条命令搞定 m3u8 下载7 个关键命令从安装到直播定时录制 浏览器里只给你一个 m3u8 或 MPD 链接你想把视频完CLI音视频Terminal.Gui 布局词汇表与概念精解从 Frame、Adornment 到 Viewport 的完整布局体系Terminal.Gui 布局词汇表与概念精解从 Frame、Adornment 到 Viewport 的完整布局体系 Terminal.Gui 的布局系统是UI组件跨平台桌面应用ego-browser 命令找不到PATH 配置与 ~/.local/bin 修复方案ego browser 命令找不到PATH 配置与 ~/.local/bin 修复方案 ➤ 最可能根因 shell 的 PATH 中缺少 ~/.local/AI 技能浏览器控制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表