2010-01-05 18 views
4

J'essaye d'implémenter un menu contextuel de clic droit using l'automation d'UI. Comme l'automatisation de l'interface utilisateur n'a pas de modèle de clic droit natif, j'ajoute un fournisseur ExpandCollapse à la classe AutomationPeer de listview et mappe l'expansion et la réduction pour ouvrir et fermer le menu contextuel.Ouvrir le menu contextuel par programmation à l'aide de l'automatisation de l'interface utilisateur?

Ma question, existe-t-il une meilleure méthode pour invoquer le menu contextuel qui n'implique pas d'essayer d'instancier une classe avec un constructeur privé? Je ne peux pas utiliser SendKeys avec Shift-F10. Je voudrais utiliser le PopupControlService mais qui est marqué comme interne.

Ma solution terrible:

public class MyListViewAutomationPeer : ListViewAutomationPeer, IExpandCollapseProvider 
{ 

    public MyListViewAutomationPeer(MyListView owner) 
     : base(owner){} 

    public override object GetPattern(PatternInterface patternInterface) 
    { 
     if (patternInterface == PatternInterface.ExpandCollapse) 
     { 
      return this; 
     } 
     return base.GetPattern(patternInterface); 
    } 

    public void Expand() 
    { 
     MyListView owner = (MyListView)Owner; 

     //********************** 
     //Ouch!!! What a hack 
     //********************** 

     //ContextMenuEventArgs is a sealed class, with private constructors 
     //Instantiate it anyway ... 
     ContextMenuEventArgs cmea = (ContextMenuEventArgs)FormatterServices.GetUninitializedObject(typeof(ContextMenuEventArgs)); 
     cmea.RoutedEvent = MyListView.ContextMenuOpeningEvent; 
     cmea.Source = owner; 

     //This will fire any developer code that is bound to the OpenContextMenuEvent 
     owner.RaiseEvent(cmea); 

     //The context menu didn't open because this is a hack, so force it open 
     owner.ContextMenu.Placement = PlacementMode.Center; 
     owner.ContextMenu.PlacementTarget = (UIElement)owner; 
     owner.ContextMenu.IsOpen = true; 

    } 

Répondre

0

Je suis trop aux prises avec le même problème. Comme un travail autour j'utilise la fonction mouse_event en utilisant user32.dll et en effectuant le clic droit après avoir obtenu les coordonnées X, Y de la zone cliquable.

Ce n'est pas une bonne méthode car les coordonnées X, Y de l'écran varient en fonction de la résolution de l'écran.