WPF:TextBox のデフォルトの ContextMenu をスタイル設定または無効にする方法

StackOverflow https://stackoverflow.com/questions/9632

  •  08-06-2019
  •  | 
  •  

質問

明らかに、ユーザーが WPF アプリケーションで右クリックし、Windows クラシック テーマを使用すると、TextBox (コピー、切り取り、貼り付けを含む) のデフォルトの ContextMenu の背景が黒になります。

これがうまく機能することはわかっています:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

  <TextBox ContextMenu="{x:Null}"/>

</Page>

しかし、これは機能しません:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<Page.Resources>

 <Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBox}">
   <Setter Property="ContextMenu" Value="{x:Null}"/>
</Style>
</Page.Resources>

  <TextBox/>
</Page> 

WPFのすべてのTextBoxのデフォルトのContextMenuをスタイル設定または無効にする方法を知っている人はいますか?

役に立ちましたか?

解決 3

最近のバグレポートにより、部分的に信頼されたアプリケーションでは ApplicationComands Cut Paste および Copy を直接使用できないことが判明しました。したがって、コントロールのコマンドでこれらのコマンドを使用しても、実行時にまったく何も行われません。

つまり、本質的にブラッドの答えはほぼそこにあり、それは確かに正しい方法のように見えました。黒い背景はありませんでしたが、問題は解決されませんでした。

Bradsの回答に基づいて、次のようにメニューを「削除」することにしました。

<ContextMenu x:Key="TextBoxContextMenu" Width="0" Height="0" />

そして、この空のコンテキスト メニューを次のように使用します。

<Style TargetType="{x:Type TextBox}">
  <Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>

他のヒント

すべての TextBox の ContextMenu をスタイルするには、次のようなことを行います。

まず、リソース セクションで、テキスト ボックス内の標準 ContextMenu として使用する ContextMenu を追加します。
例えば

<ContextMenu x:Key="TextBoxContextMenu" Background="White">
  <MenuItem Command="ApplicationCommands.Copy" />
  <MenuItem Command="ApplicationCommands.Cut" />
  <MenuItem Command="ApplicationCommands.Paste" />
</ContextMenu>

次に、コンテキスト メニュー リソースを使用する TextBox のスタイルを作成します。

<Style TargetType="{x:Type TextBox}">
  <Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>

最後に、通常どおりテキスト ボックスを使用します。

<TextBox />

代わりに、このコンテキスト メニューを一部のテキストボックスにのみ適用したい場合は、上記のスタイルを作成せず、TextBox マークアップに次のコードを追加します。

<TextBox ContextMenu="{StaticResource TextBoxContextMenu}" />

お役に立てれば!

奇妙な。 ContextMenu="{x:Null}" 役に立ちません。

ただし、これは次のことを行います。

<TextBox.ContextMenu>
    <ContextMenu Visibility="Collapsed">
    </ContextMenu>
</TextBox.ContextMenu>

TargetType を残したまま、Style リソースから x:Key 属性を削除してみてください。リソースには x:Key が必要ですが、TargetType と一緒に持っている場合は Key が優先されます。

これは、私のアプリの 1 つですべてのツールヒントをスキンするためにプロジェクトで使用するサンプル スタイルです (これは App.Resources にあります -- 注意、キーはありません)。

 <Style
    TargetType="{x:Type ToolTip}">
    <Setter
      Property="Template">
      <Setter.Value>
        <ControlTemplate
          TargetType="{x:Type ToolTip}">
          <Grid
            Width="{TemplateBinding Width}"
            Height="{TemplateBinding Height}">
            <Rectangle
              RadiusX="9"
              RadiusY="9"
              Stroke="LightGray"
              StrokeThickness="2">
              <Rectangle.Fill>
                <RadialGradientBrush>
                  <GradientStop />
                  <GradientStop
                    Color="FloralWhite"
                    Offset="0" />
                  <GradientStop
                    Color="Cornsilk"
                    Offset="2" />
                </RadialGradientBrush>
              </Rectangle.Fill>
            </Rectangle>
            <ContentPresenter
              Margin="6 4 6 4" />
          </Grid>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>

問題はありません。キーを指定しない場合は、 TargetType 私の例で使用しているのと同じ方法でキーとして使用します:)

MSDN のスタイルから引用:

の設定 TargetType の財産 TextBlock 設定せずにタイプします x:Key 暗黙的に設定します x:Key{x:Type TextBlock}. 。これは、 > > 上記のスタイルに x:Key それ以外の価値 {x:Type TextBlock}, 、スタイルはすべてのテキストブロック要素に自動的に適用されません。代わりに、スタイルをに適用する必要があります TextBlock 要素を明示的に。

http://msdn.microsoft.com/en-us/library/system.windows.style.targettype.aspx

これは私がいつも使っている方法です:

      <TextBox x:Name="MyTextbox">
         <TextBox.ContextMenu>
         <ContextMenu Visibility="Hidden"/>
         </TextBox.ContextMenu>
      </TextBox>

また、次のものも使用できます。

       MyTextbox.ContextMenu.Visibility = Visibility.Hidden;
       MyTextbox.ContextMenu.Visibility = Visibility.Visble;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top