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 中的所有 TextBox 设置样式或禁用默认 ContextMenu?

4

6 回答 6

32

要为所有文本框设置 ContextMenu 的样式,我会执行以下操作:

首先,在资源部分中,添加一个您计划在文本框中用作标准 ContextMenu 的 ContextMenu。
例如

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

其次,为您的 TextBoxes 创建一个样式,它使用上下文菜单资源:

<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 剪切粘贴和复制。因此,在您的控件的任何命令中使用这些命令在执行时绝对不会执行任何操作。

所以本质上布拉德斯的答案几乎就在那里,它看起来确实是正确的方式,即没有黑色背景,但没有解决问题。

我们决定根据 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

没关系,如果您不提供密钥,它将使用TargetTypeas 密钥,就像我的示例使用的方式一样:)

取自 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

尝试从 Style 资源中删除 x:Key 属性,留下 TargetType。我知道,您应该拥有 x:Key 作为资源,但是如果您将它与 TargetType 一起拥有,则 Key 占上风。

这是我在一个项目中使用的示例样式,用于为我的一个应用程序中的所有工具提示设置皮肤(这是在 App.Resources--notice,no Key 中)

 <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 回答
1

这是我一直使用的方式:

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

并且还可以使用:

           MyTextbox.ContextMenu.Visibility = Visibility.Hidden;
           MyTextbox.ContextMenu.Visibility = Visibility.Visble;
于 2018-12-20T05:35:30.757 回答