【问题标题】:Getting the Label text without Hotkey('&') in C#在 C# 中获取没有 Hotkey('&') 的标签文本
【发布时间】:2017-06-04 04:54:00
【问题描述】:

在我的 C# Winforms 应用程序中,我几乎没有设置热键的标签控件。(例如:&Name)。我们正在使用 JAWS 屏幕阅读器。 Label.Text 总是给出“&Name”。有没有办法在没有热键('&')的情况下获取标签文本?我不能用 String.empty 替换“&”,因为其中需要的带有实际“&”的标签很少。

【问题讨论】:

  • 而且这些标签应该有一个双&&。提示正则表达式。
  • 这是一个可访问性问题。根据您的描述,我假设屏幕阅读器正在读出 & 字符。读者呈现的东西在它自己的控制之下。 WinForms 控件支持旧的 Accessibility.IAccessible 模型。您可以尝试创建一个自定义标签,该标签反过来提供一个自定义 ControlAccessibleObject,您可以在其中覆盖 Value 属性,以使没有与号的文本可用。

标签: c# winforms hotkeys ampersand


【解决方案1】:

简单的方法是使用 AccessibleObject.Name 属性。

例如:字符串文本 = label1.AccessibleObject.Name;

【讨论】:

    【解决方案2】:

    你能举一个需要'&'的例子吗?

    TrimStart 将删除字符串开头的字符https://msdn.microsoft.com/en-us/library/system.string.trimstart(v=vs.110).aspx

    【讨论】:

      【解决方案3】:

      正如我在之前的评论中提到的,这是一个可访问性问题。以下自定义 Label 公开了一个新的 string 属性 AccessibleValue,可以将其设置为 AccessibleObject 将作为其值返回的文本。

      我不知道这是否适用于 JAWS 屏幕阅读器,但它确实在使用检查工具时显示了自定义值。

      public class AccessibleLabel : Label
          {
          protected override AccessibleObject CreateAccessibilityInstance()
              {
              return new LabelAccessibleObject(this);
              }
      
          public string AccessibleValue { get; set; }
      
          private class LabelAccessibleObject : ControlAccessibleObject
              {
              private AccessibleLabel myowner;
              public LabelAccessibleObject(AccessibleLabel owner)
                  : base(owner)
                  {
                  this.myowner = owner;
                  }
      
              public override AccessibleRole Role
                  {
                  get
                      {
                      AccessibleRole accessibleRole = base.Owner.AccessibleRole;
                      if (accessibleRole != AccessibleRole.Default)
                          {
                          return accessibleRole;
                          }
                      return AccessibleRole.StaticText;
                      }
                  }
      
              public override string Value
                  {
                  get
                      {
                      if (string.IsNullOrEmpty(myowner.AccessibleValue))
                          {
                          return base.Value;
                          }
                      else
                          {
                          return myowner.AccessibleValue;
                          }
                      }
                  set
                      {
                      base.Value = value;
                      }
                  }
      
              }
      
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-09
        • 2015-08-29
        • 1970-01-01
        • 2016-05-13
        • 1970-01-01
        • 2011-04-07
        • 1970-01-01
        相关资源
        最近更新 更多