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?
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!
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>
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>
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>
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 tipoTextBlock
sin establecer unx:Key
establece implícitamente elx:Key
a{x:Type TextBlock}
. Esto también significa que si > > le da al Estilo anterior un valorx: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 elementosTextBlock
explícitamente.
Http://msdn.microsoft.com/en-us/library/system.windows.style.targettype.aspx
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