2010-01-15 4 views
2

Comment pourrais-je ajouter quelques conditions changeantes liste des MenuItems dans un menu contextuel WPF, en fonction de certains attributs des objets cliqués ?:Comment ajouter une condition à un menu contextuel WPF?

<Grid.ContextMenu> 
<ContextMenu> 
    <MenuItem Name="EditStatusCm" Header="Change status" /> 
    ... 
    <MenuItem ... /> 
</ContextMenu>     
</Grid.ContextMenu> 

Répondre

4

Je trouve cela beaucoup plus facile de le faire aussi dans le code derrière. Si ces méthodes ok, un morceau assez facile de code exemple:

ContextMenu cm = new ContextMenu(); 

cm.Items.Clear(); 
MenuItem mi; 


mi = new MenuItem(); 
mi.Header = "myHeader"; 
mi.Click += new RoutedEventHandler(menuItemAlways_Click); 
cm.Items.Add(mi); //this item will always show up 

if(someCondition()) 
{ 
    mi = new MenuItem(); 
    mi.Header = "myConditionalHeader"; 
    mi.Click += new RoutedEventHandler(menuItemConditional_Click); 
    cm.Items.Add(mi); //This item will show up given someCondition();  
} 

cm.IsOpen = true; 

Il est évident qu'un exemple très simpliste, mais il illustre combien il est facile de le faire dans le code derrière.

EDIT: En réponse à votre commentaire, voici la méthode que je ... Les dernières

//raised upon an event, ie. a right click on a given control 
private void DisplayContextMenu(object sender, MouseButtonEventArgs e) 
{ 
    ContextMenu cm = GetAssetContextMenu() 
    //Method which builds context menu. Could pass in a control (like a listView for example) 

    cm.IsOpen = true; 
} 

private ContextMenu GetContextMenu() 
{ 
    ContextMenu cm = new ContextMenu(); 
    //build context menu 
    return cm; 
} 

Cela devrait le rendre un peu plus clair. Evidemment, la méthode GetContextMenu() prendra probablement un certain type de paramètre à partir duquel vous pouvez tirer un certain type d'état prorgam - par exemple, si vous cliquez sur listView, vous pouvez alors obtenir une valeur pour "listView.SelectedItem", à partir de laquelle vous pourriez Construire le contextMenu conditionnel. J'espère que c'est clair, je me sens un peu brumeux en ce moment.

+0

Merci pour l'exemple de code! Pourriez-vous, s'il vous plaît, donner une idée de comment connecter ce menu contextuel généré à un objet particulier sur une page? – rem

+0

Dois-je créer un ContextMenu vide en XAML et créer des éléments de menu dans le gestionnaire d'événements "ContextMenuOpening"? – rem

+0

Merci! Pourriez-vous s'il vous plaît dire, pourquoi le menu contextuel, ouverture sur l'événement MouseRightButtonDown, reste ouvert pendant une seconde ou deux, clignote juste. Que dois-je faire en plus de "cm.IsOpen = true;"? – rem

1

Je construis mes menus contextuels dans codebehind dynamiquement sur l'événement « ContextMenuOpening ». Cela fonctionne extrêmement bien. De cette façon, je peux regarder toutes mes variables en temps réel. En général, je crée un menu contextuel qui contient tout ce dont JE SAVOIRai dont j'ai besoin à chaque fois, puis je le modifie dans le code avant de le montrer. Je posterais du code mais c'est propriétaire.

Questions connexes