2008-08-13 11 views
25

Aparentemente cuando los usuarios hacen clic derecho en nuestra aplicación WPF y utilizan el tema clásico de Windows, el ContextMenu predeterminado del cuadro de texto (que contiene Copiar, Cortar y Pegar) tiene un fondo negro.WPF: Cómo personalizar o desactivar el ContextMenu predeterminado de un cuadro de texto

Sé que esto funciona así:

<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 desactivar el estilo o por defecto ContextMenu para todos los cuadros de texto en WPF?

+0

¿Usted no necesita considerar desactivar las teclas de acceso directo, por ejemplo CTRL-V? –

Respuesta

7

Debido a un informe de error tardío, descubrimos que no podemos usar ApplicationComands Cut Paste y Copy directamente en una aplicación parcialmente confiable.Por lo tanto, el uso de estos comandos en cualquier Commmand de sus controles no hará absolutamente nada cuando se ejecute.

Por lo tanto, en esencia, la respuesta de Brads estaba casi allí, de hecho parecía el camino correcto, es decir, no tenía fondo negro, pero no solucionó el problema.

Decidimos "eliminar" el menú basado en la respuesta clavitos, así:

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

y utilizar este menú contextual vacío, así:

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

o puede usar , que también funciona. – joedotnot

+0

Además, si se establece 'IsEnabled' en ContextMenu en' false', se evita el problema de "congelación" del foco cuando el usuario intenta hacer clic derecho. –

1

Intente eliminar el atributo x: Key del recurso Style, dejando TargetType. Lo sé, se supone que tienes esa clave x: para un recurso, pero si lo tienes junto con tu TargetType prevalece la clave.

He aquí una muestra de estilo que utilizo en un proyecto para desollar información sobre herramientas en una de mis aplicaciones (esto es, en App.Resources - aviso, no hay una 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> 
1

no importa, si no proporciona una clave, se utilizará la TargetType como la clave de la misma forma en que mi ejemplo se utiliza :)

Tomado de MSDN en Estilo:

al establecer la propiedad TargetType a laEl tiposin configurando x:Key establece implícitamente x:Key en {x:Type TextBlock}. Esto también significa que si>> otorga al Estilo anterior un valor de x:Key de cualquier cosa que no sea {x:Type TextBlock}, el Estilo no se aplicará a todos los elementos de TextBlock automáticamente. En cambio, necesita aplicar el estilo a los elementos TextBlock explícitamente.

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

28

Para la ContextMenu estilo para todos los cuadros de texto, me gustaría hacer algo como lo siguiente:

primer lugar, en la sección de recursos, añadir un ContextMenu que va a utilizar como su estándar ContextMenu en un cuadro de texto.
p. Ej.

<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, que utiliza el recurso de menú contextual:

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

Por último, utilice su cuadro de texto de forma normal:

<TextBox /> 

Si por el contrario desea para aplicar este menú contextual a solo algunos de sus cuadros de texto, no cree el estilo anterior y agregue lo siguiente a su marcado TextBox:

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

Espero que esto ayude!

+0

Lamento tropezar con un error ... Nunca me di cuenta, pero no puedo usar los comandos de aplicación Cortar, copiar y pegar directamente en confianza parcial. Este menú no funcionará con confianza parcial. Al hacer clic en el elemento del menú, no hace absolutamente nada. Lamento que haya tardado casi 18 meses en descubrirlo;) – Arcturus

+0

Tu respuesta me ha llevado a mi nueva solución: desactivar el menú con un menú vacío ... ¡Gracias de nuevo por tu respuesta! – Arcturus

14

extraño. ContextMenu="{x:Null}" no hace el truco.

Esto, sin embargo:

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