包含此页的版本:
不含此页的版本:
如果要实现自定义控件,则可以通过以下方式响应 UI 工具包事件:
您对事件的反应取决于情况。以下是回调和虚拟方法重写之间的区别:
虚拟方法重写适用于类的所有实例。对于覆盖HandleEventBubbleUp或HandleEventTrickleDown,您还可以在其实例上注册回调。
要覆盖HandleEventBubbleUp或HandleEventTrickleDown方法或两者,派生出一个新的子类VisualElement.
HandleEventBubbleUp和HandleEventTrickleDown在视觉元素实例化或派生自 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
}
对于给定的类实例,在以下情况下执行自定义代码具有相同的结果:
无论哪种情况,如果停止事件的传播,它都会阻止在执行当前目标回调和方法覆盖后对事件做出反应。
以下是使用自定义控件处理事件的最佳做法。
通常,要实现元素中的行为,请使用HandleEventBubbleUpmethod override。
鉴于 BubbleUp 是回调的默认传播阶段,您可以将任何代码从回调移动到HandleEventBubbleUp方法,无需担心更改代码执行时间。
将行为实现为方法重写的好处包括:
在回调或虚拟方法重写中处理事件时,可以通过调用事件上的 StopPropagation 方法之一来停止进一步的事件传播。例如,父面板可能会在涓滴阶段停止传播,以防止其子面板接收事件。
您无法阻止执行EventBase.PreDispatch()和EventBase.PostDispatch()事件类本身内的方法。
以下方法会影响事件传播:
StopImmediatePropagation():立即停止事件传播过程,以防止对事件执行任何后续回调。StopPropagation():在当前元素的最后一次回调之后停止事件传播过程。这可确保所有回调在当前元素上执行,同时防止任何进一步的元素响应事件。