2010-11-25 4 views
2

Je travaille sur une vue de graphe de noeud similaire à l'HyperGraph de Maya dans laquelle je peux connecter des Nœuds par glisser-déposer. Parce que la cible nœud peut avoir plusieurs entrées, je veux créer un ContextMenu temporaire pour sélectionner l'entrée en suggérant dans la maquette suivante:Création d'un menu contextuel par glisser complet dans WPF

http://www.pixtur.org/images/uploaded/0000/0696/large.jpg

J'ai essayé pendant un certain temps pour déclencher la création ou ouverture d'un menu contextuel. On dirait que le Win32 TrackPopupMenu fait à peu près ce que je cherche. Existe-t-il un équivalent WPF/C#?

Merci pixtur

Répondre

0

J'utilise le code suivant pour attacher un contextmenu à un en-tête de gricolumn listview:

<ListView ... MouseUp="ListView_MouseUp"> 

Dans le codebehind i défini la propriété ContextMenu de la liste sur l'événement de souris vers le haut, pour afficher le menu contextuel:

private void ListView_MouseUp(object sender, MouseButtonEventArgs e) 
    { 
     DependencyObject depObj = e.OriginalSource as DependencyObject; 

     while (depObj != null && (!(depObj is GridViewColumnHeader))) 
     { 
      depObj = VisualTreeHelper.GetParent(depObj); 
     }    

     if (depObj is GridViewColumnHeader && e.ChangedButton == MouseButton.Left) 
     { 
      ((GridViewColumnHeader)depObj).ContextMenu = ContextMenu; 
     } 
    } 

la variable ContextMenu fait référence à une instance contextmenu que je crée d bfeorehand, vous pouvez également créer le ContextMenu dans le gestionnaire d'événements Mouse. Je ne sais pas si cela aide que je ne sais pas comment vous faites le glisser/déposer, mais il vaut la peine d'essayer

+0

Salut pivotnig, oh, ce qui est très intéressant. Après quelques heures, j'ai le code suivant en cours d'exécution: – pixtur

+0

[code] cv.contextMenu.Items.Clear(); foreach (Entrée d'entrée dans targetOp.Inputs) { MenuItem item = new MenuItem(); item.Header = entrée.Nom; //item.Click cv.contextMenu.Items.Add (item); } cv.contextMenu.IsOpen = true; [/ code] Dans ce cas, cv est un parent UiElement. Cependant, maintenant, je ne parviens pas à attribuer un gestionnaire de clic temporaire pour «cliquer». Désolé, mais je ne parviens pas à mettre en forme des extraits de code pour commenter ... – pixtur

+0

merci de marquer la réponse, ça marche maintenant pour vous? si non et que vous faites face à un problème différent maintenant, je poserais une autre question – thumbmunkeys

2

Je suggère une autre solution:

Dans cet exemple, un bouton soulèvera un contexte menu avec une entrée ("Copier") sur clic droit. Si vous cliquez sur l'élément de menu contextuel "Copier", une sortie de console est générée.

[..] 
var button = new Button(); 
button.Content = "SomeButtonName"; 
button.MouseUp += HandleMouseUp; 
[..] 


private void HandleMouseUp(object sender, MouseButtonEventArgs e) 
{ 
    var senderUIControl = sender as Control; 

    var contextMenu = new ContextMenu(); 

    var item = new MenuItem(); 
    item.Header = "Copy"; 
    item.Click += (o, a) => { 
     Console.WriteLine("Copy item clicked"); 
    }; 
    contextMenu.Items.Add(item); 

    senderUIControl.ContextMenu = contextMenu; 
} 
Questions connexes