Программно открыть контекстное меню с помощью автоматизации пользовательского интерфейса?

Я пытаюсь реализовать контекстное меню правой кнопкой мыши с помощью автоматизации пользовательского интерфейса. Поскольку автоматизация пользовательского интерфейса не имеет собственного шаблона щелчка правой кнопкой мыши, я добавляю провайдера ExpandCollapse в класс AutomationPeer списка и сопоставляю развертывание и свертывание с открытием и закрытием контекстного меню.

Мой вопрос, есть ли лучший метод вызова контекстного меню, который не включает в себя попытку создания экземпляра класса с закрытым конструктором? Я не могу использовать SendKeys с Shift-F10. Я хотел бы использовать PopupControlService, но он помечен как внутренний.

Мой ужасный обходной путь:

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;

    }

Ответы на вопрос(1)

Ваш ответ на вопрос