WPF:Cómo el estilo o desactivar el valor predeterminado ContextMenu de un cuadro de texto
Pregunta
Apparantly cuando los usuarios hacen clic derecho en nuestra aplicación de WPF, y utilizan el tema Clásico de Windows, el valor predeterminado ContextMenu de la caja de texto (que contiene Copiar, Cortar y Pegar) tiene un fondo negro.
Sé que esto funciona bien:
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<TextBox ContextMenu="{x:Null}"/>
</Page>
Pero esto no 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>
¿Alguien sabe cómo el estilo o desactivar el valor predeterminado ContextMenu para todos los cuadros de texto en WPF?
Solución 3
Debido al retraso del informe de error descubrimos que no podemos usar el ApplicationComands Cortar, Pegar y Copiar directamente en un parcial de aplicaciones de confianza.Para ello, el uso de estos comandos de Comandos de los controles no hará absolutamente nada cuando se ejecuta.
Así que en esencia Clavos de respuesta fue casi allí, seguro que se veía la manera correcta de decirningún fondo negro, pero no se soluciona el problema.
Nos decidimos a "eliminar" en el menú basado en Clavos de respuesta, así:
<ContextMenu x:Key="TextBoxContextMenu" Width="0" Height="0" />
Y el uso de este vacío menú de contexto como:
<Style TargetType="{x:Type TextBox}">
<Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>
Otros consejos
El estilo de ContextMenu para todos los cuadros de texto, me gustaría hacer algo como lo siguiente:
En primer lugar, en la sección de recursos, agregar un ContextMenu que usted planea utilizar como estándar ContextMenu en un cuadro de texto.
por ejemplo,
<ContextMenu x:Key="TextBoxContextMenu" Background="White">
<MenuItem Command="ApplicationCommands.Copy" />
<MenuItem Command="ApplicationCommands.Cut" />
<MenuItem Command="ApplicationCommands.Paste" />
</ContextMenu>
En segundo lugar, crear un estilo para sus cuadros de texto, el cual utiliza el menú contextual de recursos:
<Style TargetType="{x:Type TextBox}">
<Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>
Por último, utilice el cuadro de texto de forma normal:
<TextBox />
Si por el contrario desea aplicar este menú de contexto a sólo algunos de los cuadros de texto, no cree que el estilo anterior, y añade lo siguiente a tu cuadro de texto marcado:
<TextBox ContextMenu="{StaticResource TextBoxContextMenu}" />
Espero que esto ayude!
Extraño. ContextMenu="{x:Null}"
no hacer el truco.
Esto hace, sin embargo:
<TextBox.ContextMenu>
<ContextMenu Visibility="Collapsed">
</ContextMenu>
</TextBox.ContextMenu>
Pruebe a quitar el atributo x:Key del recurso de Estilo, dejando TargetType.Yo sé, se supone que tiene que x:Clave para un recurso, pero si usted tiene junto con su TargetType la Clave es la que prevalece.
Aquí un ejemplo de un estilo que voy a usar en un proyecto para la piel toda la información de herramientas en una de mis aplicaciones (esto es en la Aplicación.Recursos--aviso, ninguna Clave)
<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>
No importa, si usted no proporciona una clave, se utilizará la TargetType
como clave de la misma forma en que mi ejemplo de uso :)
Tomado de MSDN en el Estilo:
Ajuste de la
TargetType
propiedad a laTextBlock
tipo sin la configuración de unx:Key
se establece implícitamente lax:Key
a{x:Type TextBlock}
.Esto también significa que si usted > > dar el Estilo por encima de unx:Key
el valor de otra cosa que{x:Type TextBlock}
, el Estilo no se aplican a todos los elementos TextBlock automáticamente.En su lugar, usted necesita para aplicar el estilo a laTextBlock
elementos de forma explícita.
http://msdn.microsoft.com/en-us/library/system.windows.style.targettype.aspx
Esta es la forma en que es lo que yo siempre uso:
<TextBox x:Name="MyTextbox">
<TextBox.ContextMenu>
<ContextMenu Visibility="Hidden"/>
</TextBox.ContextMenu>
</TextBox>
Y también se puede utilizar:
MyTextbox.ContextMenu.Visibility = Visibility.Hidden;
MyTextbox.ContextMenu.Visibility = Visibility.Visble;