私の作るツールでは、下図のようなコンテキストメニュー(右クリックメニュー)が表示されるようにしてある。
使用しているのは(もちろん)System.Windows.Controls.ContextMenu クラス。
でも、ツールの実行中に、コンテキストメニューを一時的に(動的に)使えないようにしたり、再び使えるようにしたいと思った。なるべく簡単に。
ケース1:IsEnabled
まず ContextMenu.IsEnabled を試してみた。.False にしてからコンテキストメニューを表示してみると、とりあえずメニューは表示されてしまうものの、メニューの各項目がグレー表示になっていて、選択できないようになっていた。
「ま、これでもいいか」と思ったのもつかの間。
表示されたコンテキストメニューが閉じない。それだけではなく、本体のウィンドウ(ダイアログ)を移動させても、表示したコンテキストメニューがその場から動かず留まっている・・・。
「ダメだこりゃ」(by いかりや長介)
ケース2:Visibility
次に ContextMenu.Visibility を試してみた。
.Visibility = Visibility.Hidden または .Visibility = Visibility.Collapsed にすると、ダイアログ上で右クリックしてもコンテキストメニューが表示されない。
「おぉ、いいんじゃない?」と思ったのもつかの間。
続けて .Visibility = Visibility.Visible を実行してみたら、画面にいきなりコンテキストメニューが現れた。しかも画面から消えてくれない(コンテキストメニューの項目の1つを実行したら消えてくれた)。
どうやら、.Visibility = Visibility.Hidden または .Visibility = Visibility.Collapsed の状態のときにダイアログ上で右クリックして表示されたコンテキストメニューが .Visibility = Visibility.Visible を実行すると可視化されるらしい(見えてないけど開いてるんですね)。「ならば」と思って、.Visibility = Visibility.Visible の直前に .IsOpen = False(コンテキストメニューを閉じる命令)を入れてみた。
うん・・・それでも .Visibility = Visibility.Visible を実行すると、一瞬、チラッとコンテキストメニューが表示されるね。そして消える。ユーザーが画面をジ~~~っと見てたら気付かれるね。
まぁ簡単だし、他に良い方法が無ければ、選択肢の1つとして取っておこうと思った。
ケース3:New ContextMenu
うまくいかないのでネット検索して調べてみると、既存のコンテキストメニューのインスタンスに新規インスタンスを代入すれば、コンテキストメニューが実行不能になるヨという情報を得た。もっともな話である。
早速 .ContextMenu = New ContextMenu を実行してみた。で、期待に胸をふくらませてダイアログ上で右クリックしてみると・・・
ん!?
なんか、コンテキストメニューの抜け殻みたいなのが表示されますネ。
「このやり方はダメかな~?」と思ってからひらめいた。
「縦横サイズをゼロにしてみよう」と。
で、結局、こんなコードになりました。
'グローバル変数 Dim orgContextMenu As ContextMenu = Nothing
If bIsEnabled = True Then If orgContextMenu IsNot Nothing Then win.ContextMenu = orgContextMenu End If Else orgContextMenu = win.ContextMenu win.ContextMenu = New ContextMenu win.ContextMenu.Height = 0 win.ContextMenu.Width = 0 End If
ちょっぴりコードが増えたけど、意図した通りに動いてくれました。良い感じです。