Панель представляет собой видимый экземпляр UI(пользовательский интерфейс). Позволяет пользователю взаимодействовать с вашим приложением. Подробнее
См. в иерархии Словарь. Он обрабатывает диспетчеризацию событий поведения элементов в иерархии визуального дерева. Он содержит ссылку на корневой визуальный элемент иерархии. Для пользовательского интерфейса во время выполнения его можно сравнить с Canvas в UGUI.
Вы должны прикрепить экземпляр визуального элемента к панели, чтобы он отображал или получал события.
События панели запускаются для визуального элемента при изменении его связи с панелью. Например, когда вы добавляете визуальный элемент на панель (AttachToPanelEvent
) или удаляете его с панели (DetachFromPanelEvent
).
События панели отправляются только тем визуальным элементам и их потомкам в иерархии, на которые непосредственно влияют изменения панели. Родительские элементы не получают событий, когда дочерние визуальные элементы присоединяются к панели или отсоединяются от нее.
Например, в приведенном ниже коде UXML при добавлении визуального элемента parent
в иерархию, которая уже прикреплена к панели, parent
, дочерний
и внучатый
получают одно и то же событие. Если вы удалите parent
из той же иерархии UXML, все визуальные элементы будут получать события DetachFromPanel
.
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements">
<ui:VisualElement name="parent">
<ui:VisualElement name="child">
<ui:VisualElement name="grandchild" />
</ui:VisualElement>
</ui:VisualElement>
</ui:UXML>
Базовым классом для всех событий панели является PanelChangedEventBase.
Событие | Описание | Стекает вниз | Пузыри вверх | Отменяемый |
---|---|---|---|---|
AttachToPanelEvent | Отправляется сразу после прикрепления элемента (или одного из его родителей) к панели. | |||
DetachFromPanelEvent | Отправляется непосредственно перед тем, как элемент (или один из его родителей) будет отсоединен от панели. |
Уникальные свойства
originPanel
: originPanel
содержит данные, относящиеся к DetachFromPanelEvent
. Он содержит исходную панель, от которой визуальный элемент отделяется во время смены панели.
destinationPanel
: destinationPanel
содержит данные, относящиеся к AttachFromPanelEvent
. Он предоставляет панель, к которой теперь прикреплен визуальный элемент.
Список событий
В следующем списке указаны имя, описание и цель каждого события в семействе событий. Дополнительную информацию о мероприятии см. в API инструментария пользовательского интерфейса.
AttachToPanelEvent
Событие AttachToPanelEvent
запускается после присоединения визуального элемента к панели. Это также происходит, когда вы добавляете визуальный элемент в иерархию, прикрепленную к панели.
target
: визуальный элемент, прикрепленный к панели.
Событие отсоединения от панели
Событие DetachFromPanelEvent
срабатывает перед удалением визуального элемента с панели. Это также происходит, когда вы удаляете визуальный элемент из иерархии, прикрепленной к панели.
target
: визуальный элемент, который отделяется от панели.
Примеры
В следующем примере создается окно редактора с кнопкой, которая добавит в окно дополнительные метки. Если щелкнуть ярлыки, они снова будут удалены.
В этом примере реализован настраиваемый класс меток, который выводит сообщение на консоль всякий раз, когда экземпляр VisualElement прикрепляется к панели или отсоединяется от нее. В нем рассказывается о поведении событий AttachToPanelEvent и DetachFromPanelEvent и о том, как использовать свойства originPanel и destinationPanel.
Чтобы увидеть пример в действии, сделайте следующее:
- В разделе Активы > Скрипты > Редактор, создайте сценарий C# с именем PanelEventsTestWindow.
- Скопируйте пример кода в скрипт C#.
- На панели инструментов редактора выберите Окно > Инструментарий пользовательского интерфейса > Окно тестирования событий панели.
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
public class PanelEventsTestWindow : EditorWindow
{
[MenuItem("Window/UI Toolkit/Panel Events Test Window")]
public static void ShowExample()
{
PanelEventsTestWindow wnd = GetWindow<PanelEventsTestWindow>();
wnd.titleContent = new GUIContent("Panel Events Test Window");
}
public void CreateGUI()
{
// Set a name for the panel
rootVisualElement.panel.visualTree.name = "Our Window Root Visual Element";
// Add a button which will add new instances of our custom labels to the window
rootVisualElement.Add(new Button(() => rootVisualElement.Add(new CustomLabel())) { text = "Add New Label" });
}
}
/// <summary>
/// Custom label class which prints out a console message when it is attached or detached.
/// </summary>
public class CustomLabel : Label
{
private static int m_InstanceCounter = 0;
private int m_LabelNumber;
public CustomLabel() : base()
{
m_LabelNumber = ++m_InstanceCounter;
text = $"Label #{m_LabelNumber} - click me to detach";
RegisterCallback<AttachToPanelEvent>(evt =>
{
Debug.Log($"I am label {m_LabelNumber} and I " +
$"just got attached to panel '{evt.destinationPanel.visualTree.name}'");
});
RegisterCallback<DetachFromPanelEvent>(evt =>
{
Debug.Log($"I am label {m_LabelNumber} and I " +
$"just got detached from panel '{evt.originPanel.visualTree.name}'");
});
// Register a pointer down callback that removes this element from the hierarchy
RegisterCallback<PointerDownEvent>(evt => this.RemoveFromHierarchy());
}
}