2009-03-29 5 views
2

NB Этот вопрос был обновлен, ЧИТАЙТЕ ДАЛЕЕ ВНИЗWPF Quad контекстное меню

Привет,

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

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

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

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

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

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

ответ

1

UPDATE

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

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

Квадратный стиль/контрольный шаблон:
- имеет классическую рамку с докпанфером и границу с текстовым блоком, чтобы поместить название меню.

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

alt text http://www.freeimagehosting.net/uploads/b70f14c836.jpg

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

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

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

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

2

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

подход 1

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

подход 2

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

+0

Эй, Стивен, спасибо, что ответили, это заставило меня думать об этом по-другому. Я обновил сообщение с моей последней попыткой, которая работает, за исключением нескольких новых проблем. :) – Dennis

+0

Любое изменение настроек по умолчанию по умолчанию всегда болезненно. Я думаю, вам будет лучше вообще, если вы не используете ContextMenu для этого и просто поедете со своими окнами. Я действительно сделал бы это поведение (http://www.codeproject.com/KB/WPF/AttachedBehaviors.aspx) – Steven

+0

Это очень больно, переопределяя поведение по умолчанию элемента управления с помощью некоторого hackey ™ через отражение для изменения внутренних/частной собственности. Я буду экспериментировать, чтобы увидеть, могу ли я создать тот же элемент управления, используя приложенное поведение, после этого отправлю сообщение, если у меня будет какой-то успех. Спасибо, Стив! – Dennis

Смежные вопросы