WPF :Comment styliser ou désactiver le ContextMenu par défaut d'une TextBox

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

  •  08-06-2019
  •  | 
  •  

Question

Apparemment, lorsque les utilisateurs cliquent avec le bouton droit sur notre application WPF et utilisent le thème Windows Classic, le menu contextuel par défaut de TextBox (qui contient Copier, Couper et Coller) a un fond noir.

Je sais que ça marche 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 ça ne marche 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 ?

Était-ce utile?

La solution 3

En raison d'un rapport de bogue tardif, nous avons découvert que nous ne pouvons pas utiliser les fonctions Couper, Coller et Copier d'ApplicationComands directement dans une application partiellement fiable.Par conséquent, l’utilisation de ces commandes dans n’importe quelle commande de vos contrôles ne fera absolument rien une fois exécutée.

Donc, en substance, la réponse de Brad était presque là, elle semblait certainement la bonne, c'est-à-direpas de fond noir, mais cela n'a pas résolu le problème.

Nous avons décidé de "supprimer" le menu en fonction de la réponse de Brad, comme ceci :

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

Et utilisez ce menu contextuel vide comme ceci :

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

Autres conseils

Pour styliser les ContextMenu pour toutes les TextBox, je ferais quelque chose comme ce qui suit :

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>

Deuxièmement, créez un style pour vos TextBox, 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 normalement :

<TextBox />

Si, à la place, vous souhaitez appliquer ce menu contextuel à certaines de vos zones de texte uniquement, ne créez pas le style ci-dessus et ajoutez ce qui suit à votre balisage TextBox :

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

J'espère que cela t'aides!

Bizarre. ContextMenu="{x:Null}" ne fait pas l'affaire.

Cela fait cependant :

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

Essayez de supprimer l'attribut x:Key de la ressource Style, en laissant TargetType.Je sais, vous êtes censé avoir ce x:Key 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 afficher toutes les info-bulles dans l'une de mes applications (c'est dans App.Resources - remarque, 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>

Ce n'est pas grave, si vous ne fournissez pas de clé, il utilisera le TargetType comme clé de la même manière que mon exemple utilise :)

Tiré de MSDN sur Style :

Réglage du TargetType propriété à la TextBlock Tapez sans définir un x:Key définit implicitement le x:Key à {x:Type TextBlock}.Cela signifie également que si vous > > donnez au style ci-dessus un x:Key valeur de quelque chose d'autre que {x:Type TextBlock}, le style ne serait pas appliqué automatiquement à tous les éléments TextBlock.Au lieu de cela, vous devez appliquer le style au TextBlock éléments explicitement.

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

C'est ainsi que j'utilise toujours :

      <TextBox x:Name="MyTextbox">
         <TextBox.ContextMenu>
         <ContextMenu Visibility="Hidden"/>
         </TextBox.ContextMenu>
      </TextBox>

Et peut également utiliser :

       MyTextbox.ContextMenu.Visibility = Visibility.Hidden;
       MyTextbox.ContextMenu.Visibility = Visibility.Visble;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top