Abre programaticamente o menu de contexto usando a automação da interface do usuário?

Estou tentando implementar um menu de contexto do botão direito usando a automação da interface do usuário. Como a automação da interface do usuário não tem um padrão nativo de clique com o botão direito do mouse, estou adicionando um provedor ExpandCollapse à classe AutomationPeer do listview e mapeando a expansão e o recolhimento para abrir e fechar o menu de contexto.

Minha pergunta, existe um método melhor de invocar o menu de contexto que não envolve a tentativa de instanciar uma classe com um construtor privado? Eu não posso usar SendKeys com Shift-F10. Eu gostaria de usar o PopupControlService, mas isso é marcado como interno.

Minha solução terrível:

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;

    }

questionAnswers(1)

yourAnswerToTheQuestion