Désactiver la touche accélératrice d'étiquette WPF (le trait de soulignement du texte est manquant)
-
09-06-2019 - |
Question
je règle le .Content
valeur d'un Label dans une chaîne contenant des traits de soulignement ;le premier trait de soulignement est interprété comme une touche accélératrice.
Sans changer la chaîne sous-jacente (en remplaçant tous _
avec __
), existe-t-il un moyen de désactiver l'accélérateur pour les étiquettes ?
La solution
Si vous utilisez un TextBlock comme contenu de l'étiquette, son texte n'absorbera pas les traits de soulignement.
Autres conseils
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>
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;
}
}
}
Utiliser un <TextBlock> ... </TextBlock>
au lieu de <Label> ... </Label>
pour imprimer le texte exact, qui comporte des traits de soulignement.