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?

25
demandé sur Jon Lin 2008-08-13 14:05:41

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!

28
répondu Brad Leach 2008-08-14 02:33:22

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

Cela ne, Cependant:

<TextBox.ContextMenu>
    <ContextMenu Visibility="Collapsed">
    </ContextMenu>
</TextBox.ContextMenu>
14
répondu Robin Davies 2014-10-16 10:12:12

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>
7
répondu Arcturus 2010-03-26 13:04:21

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>
1
répondu Will 2008-08-13 14:12:04

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 type TextBlock 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 une valeur x: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éments TextBlock explicitement.

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

1
répondu Arcturus 2014-10-16 10:14:37