2009-08-13 3 views
13
<Button Name="btnFoo" Content="Foo" > 
    <Button.ContextMenu Placement="Bottom" PlacementTarget="btnFoo"> 
     <MenuItem Header="Bar" /> 
    </Button.ContextMenu> 
</Button> 

me donne une erreur d'exécution de type « UIElement » n'a pas de classe publique TypeConverterDéfinition d'une propriété PlacementTarget de WPF ContextMenu dans XAML?

J'ai aussi essayé

<Button Name="btnFoo" Content="Foo" > 
    <Button.ContextMenu Placement="Bottom" PlacementTarget="{Binding ElementName=btnFoo}"> 
     <MenuItem Header="Bar" /> 
    </Button.ContextMenu> 
</Button> 

et qui a mis le ContextMenu dans le coin supérieur gauche de mon écran, plutôt que sur le bouton

Répondre

23

Vous devez définir la propriété ContextMenuService.Placement attachée sur le bouton, comme indiqué dans les remarques dans la documentation pour ContextMenu.Placement.

<Button Name="btnFoo" Content="Foo" ContextMenuService.Placement="Bottom"> 
    <Button.ContextMenu> 
     <ContextMenu> 
      <MenuItem Header="Bar" /> 
     </ContextMenu> 
    </Button.ContextMenu> 
</Button> 
+0

parfait, merci! – kenwarner

+0

Je suis confus. Pourquoi la liaison PlacementElement n'a-t-elle pas fonctionné? – VitalyB

+1

@VitalyB: Comme l'indique le document MSDN, la propriété PlacementTarget est modifiée lorsque le menu contextuel s'ouvre (à MousePoint ou Centre, en fonction de la façon dont l'utilisateur ouvre le menu). Pour cette raison, la définition d'une liaison sur la propriété ne fonctionnera pas - elle sera modifiée. – Tarsier

3

Avez-vous essayé:

<Button Name="btnFoo" Content="Foo"> 
    <Button.ContextMenu> 
     <ContextMenu> 
      <MenuItem Header="Bar" /> 
     </ContextMenu> 
    </Button.ContextMenu> 
</Button> 

Ceci ouvrira le ContextMenu à l'endroit où vous avez cliqué à droite sur votre souris (sur le bouton). Ce qui je pense pourrait être votre emplacement désiré non?

--- EDIT --- Dans ce cas, utilisez ceci:

<Button Name="btnFoo" Content="Foo" ContextMenuOpening="ContextMenu_ContextMenuOpening"> 
    <Button.ContextMenu> 
     <ContextMenu Placement="Bottom"> 
      <MenuItem Header="Bar" /> 
     </ContextMenu> 
    </Button.ContextMenu> 
</Button> 

Et dans le code derrière:

private void ContextMenu_ContextMenuOpening(object sender, ContextMenuEventArgs e) 
{ 
    // Get the button and check for nulls 
    Button button = sender as Button; 
    if (button == null || button.ContextMenu == null) 
     return; 
    // Set the placement target of the ContextMenu to the button 
    button.ContextMenu.PlacementTarget = button; 
    // Open the ContextMenu 
    button.ContextMenu.IsOpen = true; 
    e.Handled = true; 
} 

Vous pouvez réutiliser la méthode de plusieurs boutons et ContextMenu de ..

+1

Le projet sur lequel je travaille depuis longtemps a commencé à utiliser Buttons et ContextMenus pour créer un effet ComboBox. Bien que ce soit probablement un peu bête, il est trop tard pour le changer maintenant. Donc, je veux que le menu contextuel s'ouvre sous le bouton, pas là où le clic s'est réellement produit. – kenwarner

+0

L'édition devrait faire l'affaire ... – Zenuka

+0

Lorsque cela est mis en œuvre le menu contextuel vient sur le clic droit de la souris. Est-il possible d'obtenir la même fonctionnalité à gauche de la souris? Merci d'avance. – samar

0

Vous pouvez utiliser un <Menu />, de style comme Button et éviter les tracas avec le ContextMenuService.