WPF:Cómo el estilo o desactivar el valor predeterminado ContextMenu de un cuadro de texto

StackOverflow https://stackoverflow.com/questions/9632

  •  08-06-2019
  •  | 
  •  

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?

¿Fue útil?

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 la TextBlock tipo sin la configuración de un x:Key se establece implícitamente la x:Key a {x:Type TextBlock}.Esto también significa que si usted > > dar el Estilo por encima de un x: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 la TextBlock 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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top