WPF:TextBox のデフォルトの ContextMenu をスタイル設定または無効にする方法
質問
明らかに、ユーザーが 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;