2010-01-11 2 views

Répondre

0

Étant donné que MenuItem n'a pas de propriété ContextMenu, il n'est pas aussi facile qu'avec de nombreux autres contrôles. Vous devrez probablement capturer l'événement du clic droit, puis positionner et afficher le menu contextuel manuellement.

Deux mises en garde cependant:

  • La liste combobox fermera lorsque la liste perd le focus, il peut fermer lorsque le menu contextuel est affiché laissant l'utilisateur pas clair quant à ce que ils ont cliqué sur (pas sûr à 100% , puisque je ne l'ai pas écrit le code pour tester.)

  • Plus important encore que je dirais que ce est pauvre IU choix, je ne peut pas penser à un réel applications que j'ai utilisé qui ont menus contextuels sur les éléments de menu, de sorte qu'il ne serait pas très découvrable pour l'utilisateur final . Plus les menus contextuels devraient être juste pour un accès rapide, ils ne devrait pas être le seul moyen d'accéder aux fonctionnalités . Allez-vous être capable d'exposer ces fonctions par d'autres moyens ainsi que par le menu contextuel?

+0

Je pense que vous avez raison. Peut-être que je dois chercher une autre solution. J'ai un combobox similaire à la barre d'adresse d'un navigateur. Vous pouvez entrer un nouvel élément ou en sélectionner un existant. Ce que je veux, c'est sélectionner un existant avec la souris droite et supprimer celui-ci. – Martijn

+0

Il n'est pas trop inhabituel de le faire avec une combinaison de touches. Par exemple, vous pouvez supprimer les entrées de saisie semi-automatique dans Firefox en appuyant sur Maj + Suppr lorsque l'élément que vous souhaitez supprimer est en surbrillance (dans IE, c'est juste la touche de suppression - je pense). C'est * vraiment * mauvais pour la découvrabilité (puisque j'ai juste dû le rechercher par une recherche de Google), mais au moins il y a un précédent. –

+0

Thnx pour l'idée. Quelle est la meilleure façon de mettre en œuvre cela? – Martijn

1

Pas possible facilement. Aucun message d'événement de survol ou de clic droit n'est envoyé lorsque la liste déroulante est développée.

Vous pouvez voir que c'est le cas lorsque vous utilisez Spy ++.

Je pense que le plus simple serait de passer à une zone de liste si votre scénario vous le permet.

+0

Je ne pense pas que mon scénario le permette. Voir mon commentaire à Martin Harris. – Martijn

0

Vous pouvez le faire manuellement, en capturant l'événement sur le formulaire, mais pensez à créer un menu imbriqué à la place. Si vos objets combobox ont leurs propres menus, le combobox n'est probablement pas le bon choix.

1

Comme Wim dit dans son article, il n'y a pas un moyen direct de le faire parce que les messages que vous voulez ne sont pas virés.

En comprennent, vous pouvez essayer de mettre DropdownStyle=Simple; sur le Combo et rétrécir la région de défilement pour afficher une seule ligne:

http://img34.imageshack.us/img34/1695/49557147.jpg

Si vous attribuez le Combo un menu contextuel, il ouvrira quand la zone de défilement est cliquée avec le bouton droit. Vous auriez probablement besoin de savoir quel élément a été cliqué à droite. Mais comme d'autres l'ont dit, cela ne ressemble pas à une manière Windows standard ou à une utilisation intuitive.

Ou que diriez-vous d'une boîte de dialogue modale que vous pourriez faire apparaître à partir du menu contextuel du Combo? Dans la boîte de dialogue, vous pouvez avoir une liste parmi laquelle l'utilisateur peut sélectionner et un bouton Supprimer pour supprimer le ou les éléments sélectionnés.

2

C'est possible mais pas facile.La liste déroulante ComboBox est un ListBox natif créé à la volée. Pour obtenir le handle de cette zone de liste, vous devez envoyer le message CB_GETCOMBOBOXINFO dans l'événement DropDown. Vérifiez ma réponse au this thread pour savoir comment procéder. L'iceberg qui est susceptible de couler que Titanic est que la liste déroulante se ferme automatiquement dès qu'il perd la mise au point. Ce qui se passe dès que vous affichez le menu contextuel. Rien que tu puisses faire à ce sujet.

Envisagez une approche différente, vous pourriez utiliser un ListBox réel que vous rendre visible lorsque l'utilisateur clique sur un glyphe qui ressemble à une flèche à côté d'un TextBox.

+0

J'aime votre deuxième approche! Je n'ai pas pensé à ça! – Martijn

0

Pour ceux qui demandent "Pourquoi?" ou en disant qu'ils n'ont jamais vu une combobox avec un menu contextuel; Regardez la liste déroulante des favoris de n'importe quel navigateur Web. Vous pouvez cliquer avec le bouton droit de la souris et supprimer, modifier ou accéder à l'entrée dans l'onglet actuel, le nouvel onglet ou la nouvelle fenêtre. Je aussi ne pouvait pas obtenir une ContextMenuStrip réelle de montrer, donc je fait un menu avec une petite forme sans frontières et appeler avec:

Private Sub FavoritesBar_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles FavoritesBar.SelectedIndexChanged 
    FavIndex = FavoritesBar.SelectedIndex 'FavIndex is declared as a public string. 
    Dim Loc As Point = New Point(MousePosition) 
    FavMenu.Location = Loc 
    FavMenu.ShowDialog() 
End Sub 

Avec une contextmenu maison, assurez-vous d'ajouter « Me.Close » à la fin de chaque sous-marin ainsi que l'événement me.mouseleave.

Questions connexes