より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

WindowsFormsHost上にWPFのContextMenuを表示する

WPFだけど、WinFormsが使いたい。

そういう時はあります。PictureBoxなんてImageより使い勝手がいいですし。

WinFormsなんだけど、コンテキストメニューWPFのものを使いたいということはあります。

そうしないと古臭いUIが見え隠れしてしまうので

            <WindowsFormsHost>
                <WindowsFormsHost.ContextMenu>
                    <ContextMenu x:Name="ContextMenu1" >
                        <MenuItem Header="Menu item 1" />
                        <MenuItem Header="Menu item 2" />
                        <Separator />
                        <MenuItem Header="Menu item 3" />
                    </ContextMenu>

                </WindowsFormsHost.ContextMenu>
                <local:PanelControl x:Name="Panel" Dock="Fill" />
            </WindowsFormsHost>

例によって、上記のような普通のWPFのコントロールコンテキストメニューを設定する方法だけではコンテキストメニューは表示されません。

以下のようにクリックされた時に明示的にConextMenuを開いてあげる必要があります。

        public MapGraphicControl()
        {
            InitializeComponent();
            Panel.MouseClick += PanelOnMouseClick;
        }

        private void PanelOnMouseClick(object sender, MouseEventArgs e)
        {
            if ((e.Button & MouseButtons.Right) == MouseButtons.Right)
            {
                ContextMenu1.IsOpen = true;
            }
        }

f:id:rimever:20210319211546p:plain

参考記事

www.wpf-tutorial.com