WPF:Como estilizar ou desabilitar o ContextMenu padrão de um TextBox
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?
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 oTextBlock
digite sem definir umx:Key
define implicitamente ox:Key
para{x:Type TextBlock}
.Isso também significa que se você > > der ao estilo acima umax: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 aoTextBlock
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;