Контекстное меню WPF Quad - PullRequest
       22

Контекстное меню WPF Quad

2 голосов
/ 29 марта 2009

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

Привет,

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 30 марта 2009

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

Подход 1

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

Подход 2

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

1 голос
/ 18 мая 2009

UPDATE

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

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

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

[2] Как расположить меню в Quad: - TopLeft смещен минус фактическая ширина и высота
- TopRight смещено минус фактическая высота
- BottomLeft смещен минус фактическая высота
- BottomRight имеет смещение NOT и находится в своем исходном местоположении

alt text

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

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

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

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

...