31

ユーザーが 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 のすべての TextBoxes のデフォルトの ContextMenu をスタイルまたは無効にする方法を知っている人はいますか?

4

6 に答える 6

32

すべての 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}" />

お役に立てれば!

于 2008-08-13T14:36:20.810 に答える
22

奇妙です。ContextMenu="{x:Null}"トリックをしません。

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

<TextBox.ContextMenu>
    <ContextMenu Visibility="Collapsed">
    </ContextMenu>
</TextBox.ContextMenu>
于 2010-08-14T20:15:03.323 に答える
8

最近のバグ レポートにより、ApplicationComands の切り取り、貼り付け、コピーを部分的に信頼されたアプリケーションで直接使用できないことがわかりました。したがって、これらのコマンドをコントロールの任意の Command で使用すると、実行時にまったく何も起こりません。

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

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

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

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

<Style TargetType="{x:Type TextBox}">
  <Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>
于 2010-03-26T13:04:21.047 に答える
2

キーを指定しなくても、TargetType私の例で使用するのと同じように as キーを使用します:)

スタイルの MSDN から取得:

を設定せずにTargetTypeプロパティをTextBlock型に設定すると、x:Key暗黙的に が に設定x:Keyされ{x:Type TextBlock}ます。これはまた、 > > 上記の Style にx:Key以外の値を指定した場合{x:Type TextBlock}、 Style がすべての TextBlock 要素に自動的に適用されないことも意味します。TextBlock代わりに、スタイルを要素に明示的に適用する必要があります。

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

于 2008-08-13T14:23:07.607 に答える
1

x:Key 属性を Style リソースから削除して、TargetType を残してみてください。リソースの 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>
于 2008-08-13T14:12:04.090 に答える