2014年5月7日水曜日

wpf : ListViewの余白部分をクリックしたときにポップアップメニューを出す

ListViewの余白部分を右クリックしたときにポップアップメニューを出す場合、ListViewのContextMenuは使えません。 余白だけでなく、ListViewItemなどをクリックしたときにもポップアップメニューが出てしまうためです。 そのとき、ListViewItemに載せたコントロールにContextMenuを付けてもListViewのContextMenuが優先されて、ListViewItemのメニューは表示されません。 ListViewItemのContextMenuOpeningイベントで

とかすればListViewItemをクリックしたときポップアップメニューが表示されないようにはできますが、当然そうするとListViewItemのContextMenuは使えません。

解決策はうまく検索すれば見つかりそうですが、見つからなかったので自分でやり方を試行錯誤しました。 で、見つかったのがこれ。 結局単純なやり方で済ませました。

ListViewのMouseRightButtonUpイベントでポップアップメニューを出します。 マウスのボタンが離された場所でヒットテストをして、ListViewのスクロールに使われるScrollViewerだったら余白と判断、ポップアップメニューを表示します。 別のコントロールだったら何もしません。 それだけ。

サンプルコードはこんな感じです。 まずはMainWindow.xaml。

ListViewItemの縦のマージンを0にしないと行と行の隙間をクリックしたときもメニューが表示されてしまうので注意。

MainWindow.xaml.csです。

ListViewに表示した内容は適当です。