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;
}