代码之家  ›  专栏  ›  技术社区  ›  Arcturus

wpf:如何设置或禁用文本框的默认上下文菜单

  •  26
  • Arcturus  · 技术社区  · 16 年前

    很明显,当用户右键单击我们的WPF应用程序,并且他们使用Windows经典主题时,文本框(包含复制、剪切和粘贴)的默认上下文菜单的背景为黑色。

    我知道这很管用:

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

    6 回复  |  直到 6 年前
        1
  •  29
  •   Brad Leach    16 年前

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

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

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

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

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

    最后,正常使用文本框:

    <TextBox />
    

    如果只想将此上下文菜单应用于某些文本框,请不要创建上面的样式,并将以下内容添加到文本框标记中:

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

    希望这有帮助!

        2
  •  14
  •   akjoshi HCP    10 年前

    奇怪的。 ContextMenu="{x:Null}" 不玩这个把戏。

    然而,这确实是:

    <TextBox.ContextMenu>
        <ContextMenu Visibility="Collapsed">
        </ContextMenu>
    </TextBox.ContextMenu>
    
        3
  •  7
  •   Arcturus    14 年前

    由于最近的错误报告,我们发现不能在部分受信任的应用程序中直接使用applicationComands剪切粘贴和复制。因此,在控件的任何命令中使用这些命令在执行时都不会做任何事情。

    所以从本质上讲,Brads的答案就在那里,它看起来是正确的,即没有黑色背景,但没有解决问题。

    我们决定根据Brads的回答“删除”菜单,如下所示:

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

    使用这个空的上下文菜单,如下所示:

    <Style TargetType="{x:Type TextBox}">
      <Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
    </Style>
    
        4
  •  1
  •   Will    16 年前

    尝试从样式资源中删除x:key属性,并保留targetType。我知道,你应该有一个资源的x:key,但是如果你有了它和你的targetType,这个key就占了上风。

    下面是我在一个项目中使用的一个示例样式,它可以使我的一个应用程序中的所有工具提示(这在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>
    
        5
  •  1
  •   akjoshi HCP    10 年前

    没关系,如果不提供密钥,它将使用 TargetType 作为键,与我的示例使用的方式相同:)

    从msdn上获取样式:

    设置 目标类型 属性到 TextBlock 无型 设置一个 x:Key 隐式设置 X键 {x:Type TextBlock} . 这也意味着,如果您将上述样式 X键 任何事物的价值 _X:类型文本块 风格 不会自动应用于所有文本块元素。相反, 您需要将样式应用到 控件 元素。

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

        6
  •  0
  •   MrBi    6 年前

    这就是我一直使用的方法:

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

    也可以使用:

           MyTextbox.ContextMenu.Visibility = Visibility.Hidden;
           MyTextbox.ContextMenu.Visibility = Visibility.Visble;