WPF: Cómo aplicar estilo o deshabilitar el menú contextual predeterminado de un cuadro de texto


Aparentemente cuando los usuarios hacen clic con el botón derecho en nuestra aplicación WPF, y usan el tema Windows Classic, el menú contextual predeterminado del cuadro 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 aplicar estilo o desactivar el menú contextual predeterminado para todos los cuadros de texto en WPF?

Author: Jon Lin, 2008-08-13

5 answers

Para darle estilo a ContextMenu para todos los cuadros de texto, haría algo como lo siguiente:

Primero, en la sección recursos, agregue un ContextMenu que planea usar como su ContextMenu estándar 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, cree un estilo para sus cuadros de texto, que utiliza el recurso del menú contextual:

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

Finalmente, utilice su cuadro de texto como normal:

<TextBox />

Si en cambio desea aplicar este menú contextual solo a algunos de sus cuadros de texto, no cree el estilo anterior, y añadir lo siguiente a su cuadro de texto marcado:

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

Espero que esto ayude!

 28
Author: Brad Leach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-14 02:33:22

Extraño. ContextMenu="{x:Null}" no funciona.

Esto sí, sin embargo:

<TextBox.ContextMenu>
    <ContextMenu Visibility="Collapsed">
    </ContextMenu>
</TextBox.ContextMenu>
 14
Author: Robin Davies,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-16 10:12:12

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

Así que, en esencia, la respuesta de Brads estaba casi allí, seguro que se veía de la manera correcta, es decir, sin fondo negro, pero no solucionó el problema.

Decidimos "eliminar" el menú basado en Brads answer, así:

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

Y uso este menú contextual vacío así:

<Style TargetType="{x:Type TextBox}">
  <Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>
 7
Author: Arcturus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-26 13:04:21

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

Aquí hay un estilo de muestra que uso en un proyecto para ocultar todas las descripciones emergentes en una de mis aplicaciones (esto es en la aplicación.Recursos notice aviso, sin 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
Author: Will,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-13 14:12:04

No importa, si no proporciona una clave, usará la TargetType como clave de la misma manera que mi ejemplo usa:)

Tomado de MSDN en Estilo:

Establecer la propiedad TargetType al tipo TextBlock sin establecer un x:Key establece implícitamente el x:Key a {x:Type TextBlock}. Esto también significa que si > > le da al Estilo anterior un valor x:Key de cualquier otra cosa que no sea {x:Type TextBlock}, el Estilo no se aplicaría automáticamente a todos los elementos TextBlock. En su lugar, necesitas aplicar el estilo a los elementos TextBlock explícitamente.

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

 1
Author: Arcturus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-16 10:14:37