2009-08-19 3 views
0

Dans mon application, je souhaite que le menu contextuel d'un bouton apparaisse lorsque l'utilisateur clique sur le bouton. Je peux le faire en créant un gestionnaire d'événement pour l'événement click du bouton, puis en définissant la propriété IsOpen de son menu contextuel sur true, mais je me demande s'il existe une solution xaml pure pour faire la même chose. Des idées?Une solution Xaml pure pour définir une propriété à une valeur quand un bouton est cliqué?

Merci!

Répondre

1

Vous pouvez créer un nouveau modèle pour le bouton, puis fournir un menu contextuel dans l'arborescence visuelle du modèle. Quelque chose comme ceci:

<Style TargetType="{x:Type Button}"> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type Button}"> 
     <Border> 
      <ContentPresenter HorizontalAlignment="Center" 
          VerticalAlignment="Center"/> 
      <Border.ContextMenu> 
      <ContextMenu Name="contextMenu"> 
       <MenuItem Header="Here's a menu."/> 
      </ContextMenu> 
      </Border.ContextMenu> 
     </Border> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

Vous pouvez ensuite déclencher en utilisant la propriété IsPressed du bouton et l'accrocher à l'aide d'un compositeur avec contextMenu comme TargetName.

Ma vraie question est: à quoi sert-on? L'ouverture d'un menu contextuel sur un clic gauche va être intrinsèquement erronée, car les menus contextuels, par nature, se ferment lorsque l'on clique sur n'importe quel autre élément. Ce qui signifie que ce déclencheur, même s'il est correctement configuré, ouvrira et fermera le menu contextuel immédiatement. Je suis curieux de savoir pourquoi vous avez besoin de ce genre de comportement; il y a peut-être une meilleure façon de le faire que d'utiliser un menu contextuel.

+0

Je cherche à construire quelque chose de similaire à Office ou IE où un bouton sur la barre d'outils, lorsqu'il est cliqué, montre un menu en dessous. Dans mon scénario, chaque élément de menu dans le menu est vérifiable afin qu'un utilisateur puisse rapidement activer et désactiver des éléments de la barre d'outils. – djcouchycouch

+0

Ah. Pour ce scénario, un menu contextuel n'est certainement pas ce que vous cherchez. Ce que vous devez faire est de créer votre propre type de bouton qui possède sa propre collection d'éléments. Les éléments sont ensuite affichés dans un menu déroulant. La reformulation du contrôle de la zone de liste déroulante peut être un bon point de départ. – Charlie

0

Vous pouvez le faire apparaître en utilisant un déclencheur d'événement mais vous en aurez besoin d'un autre pour le faire disparaître. Je ne peux pas penser à une combinaison de propriétés existantes qui pourraient vous apporter quelque chose d'utile cependant.

-1

Je traiterais quelque chose comme ceci à travers la classe de modèle de vue.

public Visibility ContextMenuVisibility 
{ 
    get { return (this.ShowContextMenu) ? Visibility.Visible : Visibility.Collapsed; } 
} 

public bool ShowContextMenu { get; set; } 

Handling ces événements dynamiques qui sont à mi-chemin entre la vue et le modèle est exactement ce que la couche de modèle de vue est conçu pour faire.

Oh, et je suis moi-même pour ne pas être une pure solution XAML. Juste en offrant une autre alternative à un événement onCheckChanged.

+0

Il n'a jamais dit qu'il utilisait MVVM. Et vous ne pouvez pas vous rétrograder, mais je vais le faire pour vous, puisque cela ne l'aide pas du tout. :) – Charlie

Questions connexes