WPF: comment styliser ou désactiver le ContextMenu par défaut d'une zone de texte
Apparemment, lorsque les utilisateurs font un clic droit dans notre application WPF, et qu'ils utilisent le thème Windows Classic, le ContextMenu par défaut de la zone de texte (qui contient Copier, couper et Coller) a un fond noir.
Je sais que cela fonctionne 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>
Mais cela ne fonctionne pas:
<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>
Est-ce que quelqu'un sait comment styliser ou désactiver le ContextMenu par défaut pour toutes les zones de texte dans WPF?
5 réponses
Pour styliser ContextMenu pour toutes les zones de texte, je ferais quelque chose comme ceci:
Tout d'abord, dans la section Ressources, ajoutez un ContextMenu que vous prévoyez d'utiliser comme ContextMenu standard dans une zone de texte.
par exemple
<ContextMenu x:Key="TextBoxContextMenu" Background="White">
<MenuItem Command="ApplicationCommands.Copy" />
<MenuItem Command="ApplicationCommands.Cut" />
<MenuItem Command="ApplicationCommands.Paste" />
</ContextMenu>
Ensuite, créez un style pour vos zones de texte, qui utilise la ressource du menu contextuel:
<Style TargetType="{x:Type TextBox}">
<Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>
Enfin, utilisez votre zone de texte comme d'habitude:
<TextBox />
Si vous souhaitez plutôt appliquer ce menu contextuel à certaines de vos zones de texte, ne créez pas style ci-dessus, et ajoutez ce qui suit à votre balisage de zone de texte:
<TextBox ContextMenu="{StaticResource TextBoxContextMenu}" />
Espérons que cela aide!
Bizarre. ContextMenu="{x:Null}"
ne fait pas l'affaire.
Cela ne, Cependant:
<TextBox.ContextMenu>
<ContextMenu Visibility="Collapsed">
</ContextMenu>
</TextBox.ContextMenu>
En raison d'un rapport de bogue tardif, nous avons découvert que nous ne pouvions pas utiliser ApplicationComands Couper Coller et copier directement dans une application de confiance partielle. Par conséquent, l'utilisation de ces commandes dans N'importe quelle commande de vos contrôles ne fera absolument rien lorsqu'elle sera exécutée.
Donc, en substance, la réponse de Brads était presque là, elle avait l'air dans le bon sens, c'est-à-dire pas de fond noir, mais n'a pas résolu le problème.
Nous avons décidé de "supprimer" le menu basé sur la réponse Brads, comme ceci:
<ContextMenu x:Key="TextBoxContextMenu" Width="0" Height="0" />
Et utiliser ce menu contextuel vide comme ceci:
<Style TargetType="{x:Type TextBox}">
<Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>
Essayez de supprimer l'attribut X: Key de la ressource Style, en laissant TargetType. Je sais, Vous êtes censé avoir cette clé x:pour une ressource, mais si vous l'avez avec votre TargetType, la clé prévaut.
Voici un exemple de style que j'utilise dans un projet pour skin toutes les info-bulles dans l'une de mes applications (ceci est dans L'application.Ressources--avis, pas de Clé)
<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>
N'a pas d'importance, si vous ne fournissez pas de clé, il utilisera le TargetType
comme clé de la même manière que mon exemple utilise:)
Extrait de MSDN sur le Style:
Définir la propriété
TargetType
sur le typeTextBlock
sans définir unx:Key
définit implicitement lex:Key
à{x:Type TextBlock}
. Cela signifie également que si vous > > donnez au Style ci-dessus une valeurx:Key
autre que{x:Type TextBlock}
, Le Style ne serait pas appliqué à tous les éléments TextBlock automatiquement. Plutôt, vous devez appliquer le style à les élémentsTextBlock
explicitement.
Http://msdn.microsoft.com/en-us/library/system.windows.style.targettype.aspx