如果您要实现自定义控件,则可以通过两种方式响应__ UI__(即用户界面,User Interface)让用户能够与您的应用程序进行交互。Unity 目前支持三种 UI 系统。更多信息
See in Glossary 工具包事件:
您选择如何响应事件取决于具体情况。以下是回调和虚拟方法覆盖之间的差异:
虚拟方法覆盖适用于类的所有实例。对于覆盖 HandleEventBubbleUp 或 HandleEventTrickleDown 的类,还可以在其实例上注册回调。
要覆盖 HandleEventBubbleUp 或 HandleEventTrickleDown 方法或覆盖两者,需要派生新的 VisualElement 子类。
HandleEventBubbleUp 和 HandleEventTrickleDown 是视觉元素子类的每个实例在接收事件时执行的操作。
以下示例展示了如何自定义这些虚拟方法:
override void HandleEventBubbleUp(EventBase evt)
{
// Call the base function.
base.HandleEventBubbleUp(evt);
if (evt.eventTypeId == PointerDownEvent.TypeId())
{
// ...
}
else if (evt.eventTypeId == MouseUpEvent.TypeId())
{
// ...
}
// More event types
}
对于给定的类实例,在以下情况下执行自定义代码具有相同的结果:
在这两种情况下,如果停止事件的传播,则会阻止在执行当前目标回调和方法覆盖后对事件做出反应。
以下是使用自定义控件处理事件的最佳做法。
要从元素实现行为,通常需要使用 HandleEventBubbleUp 方法覆盖。
鉴于 BubbleUp 是回调的默认传播阶段,您可以将任何代码从回调移动到 HandleEventBubbleUp 方法,而无需考虑更改代码执行的时间。
将行为作为方法覆盖来实现的好处包括:
在回调或虚拟方法覆盖中处理事件时,可以通过调用事件上的 StopPropagation 方法之一来停止进一步的事件传播。例如,父面板可通过在涓流阶段停止传播,以阻止其子面板接收事件。
您无法阻止在事件类本身中执行 EventBase.PreDispatch() 和 EventBase.PostDispatch() 方法。
以下方法影响事件传播:
StopImmediatePropagation():立即停止事件传播流程,以防止为事件执行任何后续回调。StopPropagation():在当前元素的上一次回调后停止事件传播过程。这将确保当前元素的所有回调都得以执行,但是其他元素不会再对事件做出反应。