こんにちは、働くC#プログラマーのさんさめです。
WPFのTextBoxには、
「元に戻す」や「コピー」などの
標準機能とでも言うべき
挙動がいくつかあります。
その中でも、
「カット」「コピー」「ペースト」
については、
特に何も設定しなくても自動で
いわゆる右クリックメニューにでてきます。
しかし、
場合によっては、
この右クリックメニューを
非表示にしたいことがあります。
よくあるのは、
TextBoxよりもさらに上の要素で
右クリックメニューを設定しているのに、
TextBox上で右クリックされると
標準のものが出てしまって困る
…というケースです。
このような時は、
TextBox.ContextMenuにnullを代入することで、
標準の右クリックメニューを
表示しないようにすることが可能です。
TextBox.ContextMenuにnullを入れるとメニューは消える
TextBox.ContextMenuプロパティに
nullを代入すると言いましたが、
xamlではContextMenu=”null”と書いてもダメです。
xamlでnullを代入するためには、
次のように記述する必要があります。
<TextBox ContextMenu="{x:Null}"/>
それでは、
右クリックメニューがでないことを確認しましょう。
次のようなxamlを書いて動作確認してみます。
<Window
x:Class="TextBoxContextMenu.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Width="300"
Height="220">
<Grid Margin="4">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.3*" />
<ColumnDefinition Width="0.7*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="24" />
<RowDefinition Height="24" />
</Grid.RowDefinitions>
<TextBlock
Grid.Column="0"
VerticalAlignment="Center"
Text="メニュー出る" />
<TextBox Grid.Column="1" Margin="4" />
<TextBlock
Grid.Row="1"
Grid.Column="0"
VerticalAlignment="Center"
Text="メニュー出ない" />
<TextBox
Grid.Row="1"
Grid.Column="1"
Margin="4"
ContextMenu="{x:Null}" />
</Grid>
</Window>
そして、実行してみます。
(gifアニメです)
↑を見ると、
「メニュー出ない」の方のTextBoxでは、
右クリックをしても右クリックメニューが
出ないことを確認できます。
nullを入れれば上位のContextMenuがちゃんと伝搬する
さて次に、
より上位でContextMenuが設定されているときの
振る舞いを確認してみましょう。
先ほどのコードの一番上のGridパネルに、
ContextMenuを足してみます。
<!-- 省略 -->
<Grid Margin="4">
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Header="なんらかのメニュー" InputGestureText="Ctrl+A" />
</ContextMenu>
</Grid.ContextMenu>
<!-- 省略 -->
この状態で、
再度実行して振る舞いを見てみましょう。
(再びgifアニメです)
このように、
Gridパネル上で右クリックした時はもちろん、
ContextMenuプロパティに
nullを入れたTextBoxの方は、
ちゃんと右クリックメニューが
伝搬していることが確認できます。
空のContextMenuを入れるのはNG
ところで、
人によっては、
nullよりもパッと思いつきやすいのは、
「空のContextMenuを入れる」
という人もいるのではないでしょうか。
<TextBox>
<TextBox.ContextMenu>
<ContextMenu />
</TextBox.ContextMenu>
</TextBox>
結論から言うと、これはダメです。
空のContextMenuを入れた場合、
次の画像のように、
ごく小さな右クリックメニューが
表示されてしまいます。
見栄え的にダメというのもありますが、
この指定方法では、
上位で設定されたContextMenuが
伝搬しません。
やはり、nullを入れるというのが正道である
ということになります。
まとめ
まとめです。
- TextBoxには標準の右クリックメニューが
用意されている - ContextMenuにnullを代入すると
この挙動を無効化できる - 空のContextMenuを入れる方法は
うまくいかないので注意
最後までお読みいただき、ありがとうございました。
コメント