Вопрос

N.B. ЭТОТ ВОПРОС БЫЛ ОБНОВЛЕН, ЧИТАЙТЕ ДАЛЬШЕ ВНИЗ.

Привет,

Я хочу создать собственное контекстное меню с четырьмя подменю, каждое в своем квадранте (вверху слева, вверху справа, внизу слева, внизу справа).Похоже на: 3ds Studio Max.

Вот как я подошел к этой проблеме:— создать собственный элемент управления WPF, производный от ContextMenu[1]
— объявить 4 свойства зависимостей ContextMenu, это будут отображаемые меню, которые можно установить из XAML.
— AddOwner в ContextMenu.IsOpenProperty, добавляя уведомление об изменении свойства.
- при изменении свойства IsOpen задается свойство IsOpen 4-х дочерних контекстных меню.
- с помощью ContextMenuService установите вертикальное и горизонтальное смещения контекстных меню, чтобы они отображались в каждом квадранте;привязка фактических свойств высоты и ширины для расчета смещений.

[1] Необходимо извлечь из контекстного меню, иначе вы не сможете назначить его свойству ContextMenu в окне.

Этот появляется работает, есть проблемы с меню НЕТ остаются открытыми (они закрываются, поскольку фокус находится за пределами меню), но я уверен, что с помощью Reflector.NET можно обойти эту проблему.

Это мой первый собственный элемент управления WPF, который я пытался написать;и не уверен, что это лучший подход.

Любые предложения/идеи о том, как создать это контекстное меню Quad?

Это было полезно?

Решение 2

ОБНОВЛЯТЬ

ХОРОШО.После игры с пользовательскими элементами управления у меня есть кое-что работающий лучше, чем раньше.Все меню теперь остаются открытыми.

Что я наделал:
— создан пользовательский элемент управления с именем QuadContextMenu, производный от ContextMenu, переопределяющий ключ стиля по умолчанию.
- стиль элемента управления имеет 4 всплывающих примитива:
- каждый с именем PART_, поэтому я получаю ссылку на них, когда OnApplyTemplate.
- у каждого есть дочерний элемент QuadMenu, который является настраиваемым элементом управления, производным от MenuBase.
- у каждого есть свои свойства VerticleOffset и HorizontalOffset, привязывающиеся к ActualHeight и ActualWidth дочернего элемента [2].

Стиль QuadMenu/Шаблон управления:
- имеет классическую рамку с док-панелью и рамку с текстовым блоком для размещения названия меню.

[2] Как расположить меню в квадро-меню:- TopLeft имеет отрицательное смещение фактической ширины и высоты.
- TopRight имеет отрицательное смещение фактической высоты.
- BottomLeft имеет отрицательное смещение фактической высоты.
- Нижний правый НЕТ смещен и находится на исходном месте

alt text

НОВЫЕ ВОПРОСЫ/ПРОБЛЕМЫ

Вот следующие проблемы, связанные с осуществлением этого контроля:
1.в настоящий момент клавиатура и мышь заблокированы/захватываются первым меню, на котором вы фокусируетесь, а остальные недоступны при наведении на них курсора.это означает, что вы можете использовать только одно меню.
2.переверните MenuItem так, чтобы для TopLeft/BottomLeft подменю открывалось с левой стороны.

Я уже пытался заменить элемент меню, переопределив методы GetContainerForItemOverride, чтобы они возвращали QuadMenuItem.QuadMenuItem — это пользовательский элемент управления, производный от MenuItem.Однако когда я это делаю, я теряю функциональность подменю, что расстраивает.

Если у кого-нибудь есть какие-либо советы/хитрости/предложения о том, как решить эти проблемы, я буду очень признателен!:D Спасибо

Другие советы

Я могу придумать два подхода, ни один из них не обязательно настолько чист, но может сработать, если у вас есть время.

Подход 1

Используйте контекстное меню, но, установив шаблон, сделайте так, чтобы ContextMenu действительно просто отображал элемент управления, который открывает другие окна.Возможно, можно сделать так, чтобы открытие этих дополнительных меню не отвлекало внимание.Это может в конечном итоге по-прежнему вызывать первоначальную проблему.

Подход 2

Что произойдет, если вы установите для ContextMenu.StaysOpen значение false, а затем попытаетесь контролировать закрытие меню самостоятельно?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top