【WPF】TextBoxの右クリックメニューを非表示にするには

C#

こんにちは、働く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を入れる方法は
    うまくいかないので注意

最後までお読みいただき、ありがとうございました。

コメント

タイトルとURLをコピーしました