Отключить клавишу ускорения метки WPF (текстовое подчеркивание отсутствует)

Я устанавливаю значение .Content метки в строку, содержащую символы подчеркивания; первое подчеркивание интерпретируется как клавиша быстрого доступа.

Есть ли способ отключить ускоритель для меток без изменения базовой строки (путем замены всех _ на __)?


person Richard Morgan    schedule 02.09.2008    source источник
comment
Есть ли причина, по которой вы хотите использовать Label вместо TextBlock?   -  person Daniel Jennings    schedule 03.09.2008
comment
Да, Label делает гораздо больше, чем просто обрабатывает ускорители. Также относится к другим элементам управления (например, GroupBox), которые нельзя заменить на TextBlock.   -  person GraemeF    schedule 01.03.2010
comment
это полезно по этой теме: stackoverflow.com/questions/10452462/   -  person Emil Nachev    schedule 21.01.2016


Ответы (4)


Если вы используете TextBlock в качестве содержимого метки, его текст не будет поглощать символы подчеркивания.

person yota    schedule 09.07.2010
comment
Я просто использовал этот подход в своем приложении, и он работал как чемпион. - person RQDQ; 09.07.2010
comment
Не работает, если вы хотите сохранить уже назначенное событие двойного щелчка (у TextBlock его нет) - person Hexo; 16.10.2017

Вы можете переопределить свойство RecognizesAccessKey ContentPresenter, которое находится в шаблоне по умолчанию для метки. Например:

<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>
person denis phillips    schedule 02.09.2008
comment
Только что попробовал это, на самом деле не работает. Возможно, он удаляет привязку ключа доступа, но не предотвращает удаление подчеркивания. - person xanadont; 14.05.2009
comment
Просто скопировал код в Kaxaml и заработал. Вы пробовали как есть или вообще меняли? - person denis phillips; 15.05.2009
comment
У меня работает, но меняет внешний вид ярлыка :( - person Anders Rune Jensen; 19.03.2010
comment
@AndersRuneJensen Попробуйте использовать BasedOn="{StaticResource {x:Type Label}}", чтобы сохранить набор стилей в родительских ресурсах. - person gav; 17.11.2011
comment
Я единственный, кто думает, что есть что-то неправильное в том, чтобы написать полстраницы XAML только для того, чтобы отключить клавишу быстрого доступа? - person l46kok; 10.07.2013
comment
@ l46kok, скорее всего, нет. Причина этого в том, что WPF даст вам многое из коробки, и когда вы захотите изменить его, вам нужно быть очень конкретным. В отличие от надоедливого WinForms, где все находится в коде. - person XAMlMAX; 03.11.2017
comment
Официальная документация Microsoft этого не показывает, но я считаю, что на самом деле это должно быть <Border Padding="{TemplateBinding Padding}">. Без этого заполнение не включается, и внешний вид Label в этом шаблоне отличается от стандартного. - person Jonathan Gilbert; 08.02.2018

Используйте <TextBlock> ... </TextBlock> вместо <Label> ... </Label>, чтобы напечатать точный текст с подчеркиванием.

person satheesh reddy    schedule 19.04.2017

Почему не так?

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;
            }
        }
    }
person Community    schedule 22.05.2017
comment
Это не решение Google. Иногда строка имеет более одного символа подчеркивания, и WPF не отображает только первый из них. Это решение дублирует все символы подчеркивания и может привести к отображению повторяющегося подчеркивания. - person Gabriel; 11.05.2020