Version: 6000.3
语言: 中文
元素的焦点顺序
机器人

使用自定义控件响应事件

如果要实现自定义控件,则可以通过以下方式响应 UI 工具包事件:

您对事件的反应取决于情况。以下是回调和虚拟方法重写之间的区别:

  • 回调必须在类的实例上注册。虚拟方法需要修改类本身。
  • 虚拟方法重写具有轻微的性能优势,因为它们不需要在传播阶段在回调注册表中进行查找。

重写 HandleEventBubbleUp 或 HandleEventTrickleDown 虚拟方法

虚拟方法重写适用于类的所有实例。对于覆盖HandleEventBubbleUpHandleEventTrickleDown,您还可以在其实例上注册回调。

要覆盖HandleEventBubbleUpHandleEventTrickleDown方法或两者,派生出一个新的子类VisualElement.

HandleEventBubbleUpHandleEventTrickleDown视觉元素实例化或派生自 C# 的可视化树的节点VisualElement类。您可以设置外观样式、定义行为并将其作为 UI 的一部分显示在屏幕上。更多信息
请参阅术语表
子类。

以下示例演示如何自定义这些虚拟方法:

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
}

对于给定的类实例,在以下情况下执行自定义代码具有相同的结果:

  • 在 BubbleUp 阶段的回调集中
  • 在 HandleEventBubbleUp 方法重写中

无论哪种情况,如果停止事件的传播,它都会阻止在执行当前目标回调和方法覆盖后对事件做出反应。

最佳做法

以下是使用自定义控件处理事件的最佳做法。

实现行为

通常,要实现元素中的行为,请使用HandleEventBubbleUpmethod override。

鉴于 BubbleUp 是回调的默认传播阶段,您可以将任何代码从回调移动到HandleEventBubbleUp方法,无需担心更改代码执行时间。

将行为实现为方法重写的好处包括:

  • 方法替代不需要在回调注册表中进行查找。
  • 没有回调的实例不会进入传播过程。

停止事件传播

在回调或虚拟方法重写中处理事件时,可以通过调用事件上的 StopPropagation 方法之一来停止进一步的事件传播。例如,父面板可能会在涓滴阶段停止传播,以防止其子面板接收事件。

您无法阻止执行EventBase.PreDispatch()EventBase.PostDispatch()事件类本身内的方法。

以下方法会影响事件传播:

  • StopImmediatePropagation():立即停止事件传播过程,以防止对事件执行任何后续回调。
  • StopPropagation():在当前元素的最后一次回调之后停止事件传播过程。这可确保所有回调在当前元素上执行,同时防止任何进一步的元素响应事件。

其他资源

元素的焦点顺序
机器人