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

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

Hi,

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

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

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

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

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

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


person Dennis    schedule 29.03.2009    source источник


Ответы (2)


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

Подход 1

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

Подход 2

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

person Steven    schedule 29.03.2009
comment
Привет, Стивен, спасибо за твой ответ, он заставил меня задуматься об этом немного по-другому. Я обновил сообщение своей последней попыткой, которая работает, за исключением нескольких новых проблем. :) - person Dennis; 30.03.2009
comment
Любая настройка, выходящая за рамки стандартного поведения элемента управления, всегда болезненна. Я думаю, вам было бы лучше, если бы вы не использовали ContextMenu для этого и просто использовали свои собственные окна. Я бы на самом деле сделал это поведением (codeproject.com/KB/WPF/AttachedBehaviors.aspx) - person Steven; 01.04.2009
comment
Это очень болезненно переопределить поведение элемента управления по умолчанию, сделав некоторый хакер ™ посредством отражения, чтобы изменить внутренние / частные свойства. Я буду экспериментировать, чтобы увидеть, смогу ли я создать такой же элемент управления, используя прикрепленное поведение, и отправлю ответ, если у меня будет какой-либо успех. Спасибо, Стив! - person Dennis; 01.04.2009
comment
Подумав об этом прямо сейчас, я думаю, что можно было бы с помощью Attach Properties связать несколько контекстных меню, которые открываются / закрываются одновременно и управляют каждым как отдельным ресурсом, поскольку это действительно единственное уникальное поведение, которое мне нужно. Хм. Что-то думать о. - person Dennis; 01.04.2009

ОБНОВЛЕНИЕ

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

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

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

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

альтернативный текст

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

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

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

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

person Dennis    schedule 17.05.2009