Question

N.B. CETTE QUESTION A ETE MIS À JOUR, LIRE PLUS BAS

Salut,

Je veux créer un menu contextuel personnalisé qui dispose de 4 sous-menus, chacun dans leur propre quadrant (en haut à gauche, en haut à droite, en bas à gauche, en bas à droite). Similaire à 3ds Studio Max.

Voici comment je l'ai abordé la question jusqu'à présent: - créer un contrôle WPF personnalisé, tirer de ContextMenu [1]
- déclarer 4 propriétés de dépendance de ContextMenu, ces menus seront affichés et peuvent être réglés de XAML
. - addowner au ContextMenu.IsOpenProperty, en ajoutant une propriété notification modifiée
. - lorsque les changements de propriété IsOpen définissez la propriété IsOpen de 4 enfants menus contextuels
. - à l'aide ContextMenuService mis à la verticale et les décalages horizontaux des menus contextuels pour les faire apparaître dans chaque quadrant; les propriétés de liaison de hauteur et de largeur réelle pour calculer les décalages.

[1] besoin de tirer à partir du menu contextuel, sinon vous ne pouvez pas l'attribuer à la propriété ContextMenu sur la fenêtre.

apparaît pour travailler, il y a des problèmes avec les menus PAS rester ouvert (ils sont en cours de fermeture que l'accent est mis hors du menu) mais je suis sûr à l'aide Reflector.NET trouver un moyen de contourner cela.

Ceci est ma première commande de contrôle WPF que j'ai essayé d'écrire; et pas sûr si cela est la meilleure approche.

Toutes les suggestions / idées sur la façon de créer ce menu contextuel Quad?

Était-ce utile?

La solution 2

UPDATE

OK. Après avoir joué avec des contrôles personnalisés que j'ai quelque chose qui est travailler mieux qu'avant. Tous les menus restent ouvertes.

Qu'est-ce que je l'ai fait:
-, remplacer la clé de style par défaut créé un contrôle personnalisé nommé QuadContextMenu provenant de ContextMenu
. - le style pour le contrôle a 4 primitives popup:
    - chacun avec le nom PART_ donc j'obtenir une référence à eux quand le OnApplyTemplate
.     - chacun a un enfant QuadMenu, qui est le contrôle personnalisé provenant de MenuBase
.     - chacun a ses propriétés VerticleOffset et HorizontalOffset se liant à la ActualHeight et ActualWidth de l'enfant [2].

QuadMenu Style / Modèle de contrôle:
- a une frontière classique avec un DockPanel, et une frontière avec un TextBlock pour mettre le nom du menu.

[2] Comment positionner les menus dans le Quad: - TopLeft est décalé négatif de la largeur et la hauteur
- TopRight est négatif compensé la hauteur réelle
- bottomLeft est négatif compensé la hauteur réelle
- BottomRight est pas offset et est dans son emplacement d'origine

NOUVELLES QUESTIONS / QUESTIONS

Ce sont les prochains défis à faire ce contrôle:
1. au clavier et à la souris moment est verrouillé / capturé par le premier menu vous vous concentrez sur et les autres ne sont pas disponibles en planant au-dessus d'eux. ce qui signifie que vous ne pouvez utiliser 1 des menus.
2. retourner le MenuItem afin que le TopLeft / bottomLeft le sous-menu ouvre sur le côté gauche.

Je l'ai déjà essayé de remplacer l'élément de menu en remplaçant les méthodes GetContainerForItemOverride retourner QuadMenuItem. QuadMenuItem est un contrôle personnalisé dérive de MenuItem. Quand je fais cela mais je perds la fonctionnalité de sous-menus qui est frustrant.

Si quelqu'un a des astuces de pointe / / suggestions sur la façon d'aborder ces questions, il serait grandement apprécié! : D Merci

Autres conseils

Je peux penser à deux approches, ni l'un sont nécessairement propre mais a le potentiel de travailler si vous avez le temps.

Approche 1

Utilisez un menu contextuel, mais à travers la mise du modèle faire en sorte que le ContextMenu montre vraiment juste un contrôle qui arrive à ouvrir d'autres fenêtres. Peut-être des tours peut être fait pour que l'ouverture de ces menus secondaires ne prend pas l'accent mis. Cela pourrait finir par causer encore le problème d'origine.

Approche 2

Qu'est-ce qui se passe si vous définissez ContextMenu.StaysOpen false et puis essayer de contrôler lorsque le menu vous ferme?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top