Перейти к содержанию

Генерация контекстных меню

Генерация контекстных меню

Генерация контекстных меню посредством моделей из API Tessa.UI.Menu может потребоваться в случае, когда необходимо отделить бизнес-логику пунктов меню от кода пользовательского интерфейса. Например, расширения, создающие действия для файлов или меню фильтрации файлов, не зависят от того, где и каким образом такие действия отображаются, поэтому не представляется сложным реализовать другой элемент управления файлами, отображающий контекстные меню иным способом, и использовать созданные действия в таких меню.

В дополнение к этому все действия создаются единым образом: действия для контекстных меню файлов, версий файлов, меню элемента управления файлами, меню фильтрации файлов, контекстного меню для строк представлений и т.д.

Приведём пример того, как может быть организован обработчик на нажатие правой кнопкой мыши на некотором элементе управления или другом объекте UI, который должен привести к отображению контекстного меню, созданного через API Tessa.UI.Menu.

using Tessa.Platform.Collections; using Tessa.UI.Menu;

private IUnityContainer unityContainer;

private void Item_OnRightClick(object sender, MouseButtonEventArgs e) { // указываем контекст, в котором должны выполняться все команды меню // для примера используется текущий контекст IUIContext context = UIContext.Current;

// указываем делегат, выполняющий заданное действие в контексте UIContextExecutor contextExecutor = action => { using(UIContext.Create(context)) { action(context); } };

// создаём объекты действий MenuAction и наполняем коллекцию; // такие действия можно создать в коде расширений на бизнес-логику; // класс MenuActionSeparator можно использовать для создания разделителей // (горизонтальных линий) между элементами меню var actions = new MenuActionCollection(); actions.AddRange( new MenuAction(...), new MenuActionSeparator(...), new MenuAction(...));

// получаем генератор визуальных объектов для пунктов меню; // его можно получить из контейнера Unity или через Dependency Injection, // например, указав его в конструкторе класса var generator = this.unityContainer.Resolve<IMenuActionGenerator>();

// создаём визуальные объекты для действий actions var visual = generator.GenerateActions(actions, contextExecutor);

// создаём объект, выводящий контекстное меню // и очищающий занятые ресурсы после закрытия меню var menuManager = new MenuManager(new ContextMenu(), visual); menuManager.Initialize();

// позиционируем меню по тому объекту sender, // по которому кликнули правой кнопкой, и открываем меню menuManager.ShowContextMenu(sender as FrameworkElement);

// обработка нажатия на правую кнопку мыши выполнена e.Handled = true; }

Back to top