Pergunta

Aparentemente, quando os usuários clicam com o botão direito em nosso aplicativo WPF e usam o tema Windows Classic, o ContextMenu padrão do TextBox (que contém Copiar, Recortar e Colar) tem um fundo preto.

Eu sei que isso funciona bem:

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

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

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

</Page>

Mas isso não funciona:

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

Alguém sabe como estilizar ou desabilitar o ContextMenu padrão para todos os TextBoxes no WPF?

Foi útil?

Solução 3

Devido a um relatório de bug tardio, descobrimos que não podemos usar o ApplicationComands Cut Paste and Copy diretamente em um aplicativo parcialmente confiável.Portanto, usar esses comandos em qualquer comando de seus controles não fará absolutamente nada quando executado.

Então, em essência, a resposta de Brad estava quase lá, com certeza parecia da maneira certa, ou seja,sem fundo preto, mas não resolveu o problema.

Decidimos "remover" o menu com base na resposta de Brad, assim:

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

E use este menu de contexto vazio assim:

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

Outras dicas

Para estilizar ContextMenu para todos os TextBoxes, eu faria algo como o seguinte:

Primeiro, na seção de recursos, adicione um ContextMenu que você planeja usar como ContextMenu padrão em uma caixa de texto.
por exemplo.

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

Em segundo lugar, crie um estilo para seus TextBoxes, que utilize o recurso do menu de contexto:

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

Finalmente, use sua caixa de texto normalmente:

<TextBox />

Se, em vez disso, você quiser aplicar este menu de contexto apenas a algumas de suas caixas de texto, não crie o estilo acima e adicione o seguinte à sua marcação TextBox:

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

Espero que isto ajude!

Bizarro. ContextMenu="{x:Null}" não funciona.

Isso faz, no entanto:

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

Tente remover o atributo x:Key do recurso Style, deixando TargetType.Eu sei, você deveria ter esse x:Key para um recurso, mas se você o tiver junto com seu TargetType, a chave prevalecerá.

Aqui está um estilo de exemplo que uso em um projeto para ocultar todas as dicas de ferramentas em um dos meus aplicativos (isso está em App.Resources - aviso, sem chave)

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

Não importa, se você não fornecer uma chave, ele usará o TargetType como chave da mesma forma que meu exemplo usa :)

Retirado do MSDN em estilo:

Configurando o TargetType propriedade para o TextBlock digite sem definir um x:Key define implicitamente o x:Key para {x:Type TextBlock}.Isso também significa que se você > > der ao estilo acima uma x:Key valor de qualquer coisa que não seja {x:Type TextBlock}, o estilo não seria aplicado a todos os elementos de bloco de texto automaticamente.Em vez disso, você precisa aplicar o estilo ao TextBlock elementos explicitamente.

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

Esse é o jeito que eu sempre uso:

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

E também pode usar:

       MyTextbox.ContextMenu.Visibility = Visibility.Hidden;
       MyTextbox.ContextMenu.Visibility = Visibility.Visble;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top