Генерация контекстных меню
Генерация контекстных меню¶
Генерация контекстных меню посредством моделей из 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;
}