Pergunta

NB Esta questão tem sido atualizado, LEIA ainda mais para baixo

Oi,

Eu quero criar um menu de contexto personalizado que tem 4 sub-menus, cada um em seu próprio quadrante (canto superior esquerdo, superior direito, inferior esquerdo, canto inferior direito). Semelhante ao 3ds Studio Max.

Isto é como eu abordou a questão até agora: - criar um controle personalizado WPF, derivam ContextMenu [1]
- declarar 4 propriedades de dependência de ContextMenu, estes serão menus exibidos e pode ser ajustado de XAML
. - addowner ao ContextMenu.IsOpenProperty, adicionar uma propriedade mudou notificação
. - quando a propriedade IsOpen muda definir a propriedade IsOpen de menus de contexto 4 criança
. - usando ContextMenuService definir os deslocamentos verticais e horizontais dos menus de contexto para torná-los aparecer em cada quadrante; de ligação das propriedades de altura e largura real para calcular os deslocamentos.

[1] precisa derivar do menu de contexto de outra forma você não pode atribuí-lo à propriedade ContextMenu na janela.

Este aparece para o trabalho, há problemas com os menus não ficar aberto (eles estão sendo fechados enquanto o foco está fora do menu), mas tenho certeza usando Reflector.NET encontrar uma maneira de contornar isso.

Este é o meu primeiro controle WPF personalizado que eu já tentou escrever; e não sei se isso é melhor abordagem.

Todas as sugestões / ideias sobre como criar este menu de contexto Quad?

Foi útil?

Solução 2

Atualizar

OK. Depois de brincar com os controles personalizados que tenho algo que é trabalho melhor do que antes. Todos os menus actualmente abertos.

O que eu fiz:
- controle personalizado criado chamado QuadContextMenu decorrente de ContextMenu, substituir a chave de estilo padrão
. - o estilo para o controle tem 4 primitivas pop-up:
- cada um com nome PART_ assim que eu conseguir uma referência a eles quando o OnApplyTemplate
. - cada um tem criança QuadMenu, que é o controle personalizado decorrente MenuBase
. - cada um tem as suas propriedades VerticleOffset e HorizontalOffset que se ligam ao ActualHeight e ActualWidth da criança [2].

Control Template / Style QuadMenu:
- tem uma fronteira clássico com um DockPanel, e uma fronteira com um textblock para colocar o nome do menu.

[2] Como posicionar os menus para o Quad: - TopLeft é negativo compensar a largura real e altura
- TopRight é negativo compensar a real altura
- BottomLeft é negativo compensar a real altura
- BottomRight é não offset e está em sua localização original

text alt

NOVAS PERGUNTAS / PROBLEMAS

Estes são os próximos desafios para fazer esse controle:
1. no teclado momento e mouse está bloqueado / capturado pelo primeiro menu você focar e os outros não estão disponíveis passando o mouse sobre elas. que significa que você só pode usar 1 dos menus.
2. Vire o MenuItem para que para o TopLeft / BottomLeft o submenu é aberto no lado esquerdo.

Eu já tentou substituir o item de menu, substituindo os métodos GetContainerForItemOverride para retornar QuadMenuItem. QuadMenuItem é um derivam controle personalizado de MenuItem. Quando eu faço isso, porém, eu perder a funcionalidade submenus que é frustrante.

Se alguém tiver alguma dica / truques / sugestões sobre como lidar com estas questões seria muito apreciada! : D Graças

Outras dicas

Não consigo pensar em duas abordagens, nem um são necessariamente que limpo, mas tem o potencial de trabalho, se você tiver o tempo.

Abordagem 1

Use um menu de contexto, mas através da criação do Modelo fazê-lo assim que o ContextMenu realmente apenas mostra um controle que acontece com as outras janelas abertas. Talvez truques pode ser feito de modo que a abertura destes menus secundários não tirar o foco. Isso pode acabar ainda causando o problema original.

Abordagem 2

O que acontece se você definir ContextMenu.StaysOpen como false e, em seguida, tentar controlar quando o menu fecha-se?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top