禁用WPF标签加速键(文本下划线丢失)

64

我正在将一个标签的.Content值设置为一个包含下划线的字符串;第一个下划线被解释为加速键。

在不更改基础字符串(通过替换所有___)的情况下,有没有一种方法可以禁用标签的加速器?


1
你想使用Label而不是TextBlock,有什么原因吗? - Daniel Jennings
1
是的 - Label 不仅处理加速器,还适用于其他控件(例如 GroupBox),这些控件不能被 TextBlock 替代。 - GraemeF
1
这是关于此主题的有用信息: https://dev59.com/smkv5IYBdhLWcg3wpCXJ - Emil Nachev
4个回答

93

如果您将TextBlock用作Label的内容,它的文本不会吸收下划线。


2
我刚在我的应用程序中使用了这种方法,它非常有效。 - RQDQ
2
如果您想保留已分配的双击事件,则无法使用该方法(TextBlock没有该事件)。 - Hexo

36
您可以覆盖标签默认模板中的ContentPresenter的RecognizesAccessKey属性。例如:
<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>

你刚刚把代码复制到 Kaxaml 中运行了吗?你是原封不动地运行的还是做了一些改动? - denis phillips
1
可以运行,但是改变了标签的外观 :( - Anders Rune Jensen
35
只有我一个人认为为了禁用加速键而必须写下半页的XAML代码是有些不妥吗? - TtT23
@l46kok 很可能不会。原因是WPF会为您提供很多开箱即用的功能,当您想要更改它时,您需要非常具体。与烦人的WinForms不同,其中所有内容都在代码后面。 - XAMlMAX
1
微软的官方文档没有显示这个,但我认为应该实际上有 <Border Padding="{TemplateBinding Padding}">。如果没有这个,填充就不会被合并,与默认模板相比,这个模板的 Label 的视觉外观是不同的。 - Jonathan Gilbert
显示剩余2条评论

1
使用 <TextBlock> ... </TextBlock> 代替 <Label> ... </Label> 来打印带下划线的确切文本。

0
为什么不这样做?
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
这不是一个好的解决方案。有时候字符串中有多个下划线,而 WPF 并不能只显示第一个。这种解决方案复制所有的下划线,可能最终会导致重复的下划线被显示出来。 - Gabriel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接