WPF Quad Context Menu
-
22-08-2019 - |
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?
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
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?