События контекстного меню
Используйте события контекстного меню ContextualMenuManipulator и ContextualMenuPopulateEventдля отображения набора вариантов при выполнении пользователем определенных действий, например, при щелчке правой кнопкой мыши по метке.
Включить контекстные меню
Чтобы включить контекстные меню, прикрепите ContextualMenuManipulator к визуальному элементу. Этот манипулятор отображает контекстное меню после события поднятия правой кнопки мыши или события поднятия клавиши меню. Манипулятор ContextualMenuManipulator также добавляет обратный вызов, который отвечает на ContextualMenuPopulateEvent.
Следующий пример кода добавляет контекстное меню к визуальному элементу. Меню содержит только один пункт.
void InstallManipulator(VisualElement element)
{
ContextualMenuManipulator m = new ContextualMenuManipulator(MyDelegate);
m.target = element;
}
void MyDelegate(ContextualMenuPopulateEvent evt)
{
// Modify evt.menu
evt.menu.AppendAction("My action", DisplayProperties, DropdownMenuMenuAction.AlwaysEnabled);
}
void DisplayProperties(DropdownMenu.MenuAction menuItem)
{
// ...
}
Обратный вызов конструктора ContextualMenuManipulator вызывается последним, чтобы дочерние элементы могли заполнить меню.
Манипулятор отправляет событие ContextualMenuPopulateEvent, распространяемое в иерархию элементов назначения. Событие перемещается вдоль пути распространения: от корня визуального дерева до назначения события, а затем вверх по визуальному дереву до корня. Вдоль пути распространения элементы, имеющие обратный вызов для события ContextualMenuPopulateEvent, могут добавлять, удалять или обновлять элементы в контекстном меню.
Ответить на выбор пользователя
Когда элемент получает ContextualMenuPopulateEvent, он вызывает либо DropdownMenu.InsertAction() или DropdownMenu.AppendAction(), чтобы добавить пункты меню в контекстное меню. DropdownMenu.InsertAction() и DropdownMenu.AppendAction() принимают в качестве параметров два обратных вызова. Первый выполняется, когда пользователь выбирает пункт в меню. Второй выполняется перед отображением меню и также проверяет, включён ли пункт меню.
Оба обратных вызова получают MenuAction в качестве параметра. MenuAction представляет пункт меню и имеет следующие свойства:
MenuAction.userDataвключает ссылку на пользовательские данные, используемые сAppendAction()илиInsertAction().MenuAction.eventInfoсодержит информацию о событии, которое отображает контекстное меню. ИспользуйтеMenuAction.eventInfoв действии, которое отвечает на это событие. Например, вы можете использовать позицию мыши для создания и размещения объекта, основанного на выбранном элементе контекстного меню.
Примеры
В следующем примере создается настраиваемое окно Редактора с двумя метками и добавляются контекстные меню для каждой метки. В примере показано, как добавить, удалить и обновить контекстное меню.
Создайте проект Unity с любым шаблоном.
В окне Project создайте папку
Editor.-
В окне
Editorсоздайте скрипт C# с именемContextualMenuDemo.csсо следующим содержанием:using UnityEditor; using UnityEngine; using UnityEngine.UIElements; public class ContextualMenuDemo : EditorWindow { [MenuItem("Window/ContextualMenuDemo")] public static void ShowExample() { ContextualMenuDemo wnd = GetWindow<ContextualMenuDemo>(); wnd.titleContent = new GUIContent("ContextualMenuDemo"); } public void CreateGUI() { VisualElement root = rootVisualElement; VisualElement label = new Label("Right click me!"); root.Add(label); AddANewContextMenu(label); InsertIntoAnExistingMenu(label); VisualElement second = new Label("Click me also!"); root.Add(second); AddANewContextMenu(second); InsertIntoAnExistingMenu(second); // Override the default behavior by clearing the menu. ReplaceContextMenu(second); } void AddANewContextMenu(VisualElement element) { // The manipulator handles the right click and sends a ContextualMenuPopulateEvent to the target element. // The callback argument passed to the constructor is automatically registered on the target element. element.AddManipulator(new ContextualMenuManipulator((evt) => { evt.menu.AppendAction("First menu item", (x) => Debug.Log("First!!!!"), DropdownMenuAction.AlwaysEnabled); evt.menu.AppendAction("Second menu item", (x) => Debug.Log("Second!!!!"), DropdownMenuAction.AlwaysEnabled); })); } void InsertIntoAnExistingMenu(VisualElement element) { element.RegisterCallback<ContextualMenuPopulateEvent>((evt) => { evt.menu.AppendSeparator(); evt.menu.AppendAction("Another action", (x) => Debug.Log("Another Action!!!!"), DropdownMenuAction.AlwaysEnabled); }); } void ReplaceContextMenu(VisualElement element) { element.RegisterCallback<ContextualMenuPopulateEvent>((evt) => { evt.menu.ClearItems(); evt.menu.AppendAction("The only action", (x) => Debug.Log("The only action!"), DropdownMenuAction.AlwaysEnabled); }); } } Чтобы увидеть пример в реальном времени, в меню выберите Окно > UI Toolkit > ContextualMenuDemo.