【问题标题】:Disable WPF label accelerator key (text underscore is missing)禁用 WPF 标签加速键(缺少文本下划线)
【发布时间】:2010-09-07 15:09:06
【问题描述】:

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

在不更改底层字符串的情况下(通过将所有_ 替换为__),有没有办法禁用标签的加速器?

【问题讨论】:

  • 您是否有理由要使用标签而不是文本块?
  • 是的 - Label 不仅仅是处理加速器。也适用于无法被TextBlock 替换的其他控件(例如GroupBox)。
  • 这对这个主题很有帮助:stackoverflow.com/questions/10452462/…

标签: wpf user-interface


【解决方案1】:

如果你使用 TextBlock 作为 Label 的 Content,它的 Text 不会吸收下划线。

【讨论】:

  • 我刚刚在我的应用程序中使用了这种方法,它就像一个冠军。
  • 如果要保留已分配的双击事件则不起作用(TextBlock 没有)
【解决方案2】:

您可以覆盖标签默认模板中 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 并工作。您是按原样尝试还是完全改变?
  • 对我有用,但改变了标签的外观:(
  • 只有我一个人认为写半页 XAML 只是为了禁用加速键有什么问题吗?
  • 微软的官方文档没有显示这个,但我相信这实际上应该有&lt;Border Padding="{TemplateBinding Padding}"&gt;。如果没有这个,则不会合并填充,并且与默认值相比,此模板的 Label 的视觉外观会有所不同。
【解决方案3】:

使用&lt;TextBlock&gt; ... &lt;/TextBlock&gt; 而不是 &lt;Label&gt; ... &lt;/Label&gt; 来打印带有下划线的确切文本。

【讨论】:

    【解决方案4】:

    为什么不这样呢?

    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;
                }
            }
        }
    

    【讨论】:

    • 这不是 goog 解决方案。有时字符串有多个下划线,WPF 不会只显示其中的第一个。此解决方案会重复所有下划线,最终可能会显示重复的下划线。
    猜你喜欢
    • 1970-01-01
    • 2011-08-01
    • 2014-05-01
    • 1970-01-01
    • 2015-02-07
    • 2010-12-01
    • 1970-01-01
    • 2017-05-31
    相关资源
    最近更新 更多