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

Я пытаюсь реализовать контекстное меню правой кнопкой мыши с помощью автоматизации пользовательского интерфейса. Так как автоматизация пользовательского интерфейса не имеет собственного шаблона щелчка правой кнопкой мыши, я добавляю провайдера 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)

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