65 votes

Désactiver la touche d'accélération des étiquettes WPF (le soulignement du texte est absent)

Je règle le .Content d'une étiquette à une chaîne qui contient des traits de soulignement ; le premier trait de soulignement est interprété comme une clé d'accélération.

Sans modifier la chaîne de caractères sous-jacente (en remplaçant tous les _ avec __ ), existe-t-il un moyen de désactiver l'accélérateur pour les Labels ?

1 votes

Y a-t-il une raison pour laquelle vous voulez utiliser une étiquette plutôt qu'un bloc de texte ?

1 votes

Oui - Label fait bien plus que gérer les accélérateurs. S'applique également à d'autres contrôles (par ex. GroupBox ) qui ne peut pas être remplacé par un TextBlock .

1 votes

C'est utile sur ce sujet : stackoverflow.com/questions/10452462/

95voto

yota Points 416

Si vous utilisez un TextBlock comme contenu de l'étiquette, son texte n'absorbera pas les caractères de soulignement.

2 votes

Je viens d'utiliser cette approche dans mon application et ça a marché comme sur des roulettes.

2 votes

Ne fonctionne pas si vous souhaitez conserver un événement de double-clic déjà attribué (TextBlock ne le possède pas).

36voto

denis phillips Points 7349

Vous pouvez remplacer la propriété RecognizesAccessKey du ContentPresenter qui se trouve dans le modèle par défaut de l'étiquette. Par exemple :

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Grid>
    <Grid.Resources>
      <Style x:Key="{x:Type Label}" BasedOn="{StaticResource {x:Type Label}}" TargetType="Label">
        <Setter Property="Template">
          <Setter.Value>
            <ControlTemplate TargetType="Label">
              <Border>
                <ContentPresenter
                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                  RecognizesAccessKey="False" />
              </Border>
            </ControlTemplate>
          </Setter.Value>
        </Setter>
      </Style>
    </Grid.Resources>
    <Label>_This is a test</Label>
  </Grid>
</Page>

0 votes

Je viens d'essayer ça, ça ne marche pas, en fait. Peut-être que ça supprime la liaison entre les clés d'accès, mais ça n'empêche pas le trait de soulignement d'être supprimé.

0 votes

J'ai juste copié le code dans Kaxaml et ça a marché. Avez-vous essayé tel quel ou l'avez-vous modifié ?

1 votes

Cela fonctionne pour moi, mais change l'aspect de l'étiquette :(

1voto

satheesh reddy Points 11

Utilisez un <TextBlock> ... </TextBlock> au lieu de <Label> ... </Label> pour imprimer le texte exact, qui comporte des caractères de soulignement.

1voto

micahtan Points 6457

Bien que Label soit plus lourd, il prend en charge de belles fonctions d'alignement que TextBlock ne possède pas. Par exemple, TextBlock n'a pas d'analogue de VerticalContentAlignment.

0voto

Pourquoi pas comme ça ?

public partial class LabelEx : Label
    {
        public bool PreventAccessKey { get; set; } = true;

        public LabelEx()
        {
            InitializeComponent();
        }

        public new object Content
        {
            get
            {
                var content = base.Content;
                if (content == null || !(content is string))
                    return content;

                return PreventAccessKey ?
                    (content as string).Replace("__", "_") : content;
            }
            set
            {
                if (value == null || !(value is string))
                {
                    base.Content = value;
                    return;
                }

                base.Content = PreventAccessKey ?
                    (value as string).Replace("_", "__") : value;
            }
        }
    }

2 votes

Ce n'est pas une bonne solution. Parfois, une chaîne de caractères contient plus d'un trait de soulignement et WPF n'affiche pas seulement le premier d'entre eux. Cette solution duplique tous les tirets bas et peut aboutir à l'affichage d'un double tiret.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X