.NET Framework 中辅助功能的新增功能

.NET Framework 旨在让用户更轻松地使用应用程序。 辅助功能使应用程序能够为辅助技术用户提供最佳体验。 从 .NET Framework 4.7.1 开始,.NET Framework 包括大量辅助功能改进,使开发人员能够创建易于访问的应用程序。

辅助功能开关

如果应用面向 .NET Framework 4.7 或更低版本,但是在 .NET Framework 4.7.1 或更高版本上运行,可以将应用配置为选择使用辅助功能。 如果应用面向 .NET Framework 4.7.1 或更高版本,还可以将应用配置为使用旧版功能(且不使用辅助功能)。 包括辅助功能的每个 .NET Framework 版本都有一个特定于版本的辅助开关,请将它添加到应用程序配置文件 <runtime> 部分中的 <AppContextSwitchOverrides> 元素。 以下是受支持的开关:

Version 开关
.NET Framework 4.7.1 "Switch.UseLegacyAccessibilityFeatures"
.NET Framework 4.7.2 "Switch.UseLegacyAccessibilityFeatures.2"
.NET Framework 4.8 "Switch.UseLegacyAccessibilityFeatures.3"
.NET Framework 4.8 的 2020 年 8 月 11 日 KB4569746 累积更新 "Switch.UseLegacyAccessibilityFeatures.4"
.NET Framework 4.8.1 "Switch.UseLegacyAccessibilityFeatures.5"

利用辅助功能改进

对于面向 .NET Framework 4.7.1 或更高版本的应用程序,新的辅助功能默认情况下处于启用状态。 此外,对于面向 .NET Framework 早期版本,但在 .NET Framework 4.7.1 或更高版本上运行的应用程序,可通过将开关添加到应用程序配置文件 <runtime> 部分中的 <AppContextSwitchOverrides> 元素并将其值设为 false 来选择弃用旧辅助功能行为(因而利用辅助功能改进)。 以下代码片段演示如何选择使用 .NET Framework 4.7.1 中推出的辅助功能改进:

<runtime>
    <!-- AppContextSwitchOverrides value attribute is in the form of key1=true|false;key2=true|false  -->
    <AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false" />
</runtime>

如果选择使用更高的 .NET Framework 版本中的辅助功能,还必须显式选择使用更低版本的功能。 若要配置应用以利用 .NET Framework 4.7.1 和 4.7.2 中的辅助功能改进,请添加以下 <AppContextSwitchOverrides> 元素:

<runtime>
    <!-- AppContextSwitchOverrides value attribute is in the form of key1=true|false;key2=true|false  -->
    <AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false" />
</runtime>

若要配置应用以利用 .NET Framework 4.7.1、4.7.2、4.8 和 .NET Framework 4.8 的 2020 年 8 月累积更新中的辅助功能改进,请添加以下 <AppContextSwitchOverrides> 元素:

<runtime>
    <!-- AppContextSwitchOverrides value attribute is in the form of key1=true|false;key2=true|false  -->
    <AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false;Switch.UseLegacyAccessibilityFeatures.3=false;Switch.UseLegacyAccessibilityFeatures.4=false"/>
</runtime>

还原旧行为

对于面向 .NET Framework 4.7.1 或更高版本的应用程序,可通过将开关添加到应用程序配置文件 <runtime> 部分中的 <AppContextSwitchOverrides> 元素并将其值设为 true 来禁用辅助功能。 例如,以下配置选择弃用 .NET Framework 4.7.2 中引入的辅助功能:

<runtime>
    <!-- AppContextSwitchOverrides value attribute is in the form of key1=true|false;key2=true|false  -->
    <AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures.2=true" />
</runtime>

.NET Framework 4.8.1 中辅助功能的新增功能

.NET Framework 4.8.1 在以下几个领域包含新增辅助功能:

Windows 窗体

添加并改进了 UIA 表示形式

在 .NET Framework 4.8.1 之前,Windows 窗体缺少对一系列 UIA 模式的支持,以支持辅助技术与应用程序交互。 此缺陷可能导致讲述人或其他屏幕阅读器报告不完整或不正确的信息。 它还可能会影响重要的功能,例如在 TextBox 控件中的文本中移动游标。 在 .NET Framework 4.8.1 中,已实现通用控件的所有必需模式。 这种新功能为辅助技术用户提供了更丰富的应用程序交互体验。

  • DateTimePicker 控件添加了对 UIA 展开/折叠模式的支持。
  • MonthCalendar 控件添加了 UIA 支持。 现在,辅助技术工具(如讲述人)可以在控件中浏览各个日期。
  • 实现了对所有基于文本的控件的文本模式支持,包括 TextBoxMaskedTextBoxPropertyGrid 编辑控件、DataGridViewTextBoxCellToolStripTextBoxDomainUpDown 控件。
  • ToolTip 现在遵循 WCAG2.1 准则,以在 Windows 11 上持久保存、可消除和可悬停。 对工具提示行为的更改仅限于安装了 .NET Framework 4.8.1 的 Windows 11 系统,并且仅适用于没有为工具提示设置超时的应用程序。 可以使用 Esc 键或 Ctrl 键或通过导航到具有其他工具提示集的控件来消除持久保存的工具提示。

现有辅助功能的各种 bug 修复

  • 讲述人现在可以专注于空 DataGridView 控件。
  • 解决了在 DataGridView 控件中播报列计数时导致屏幕阅读器对隐藏列进行计数的问题。
  • 解决了以下问题:如果基础表单具有与 DefaultFont 不同的 Font 属性,则导致 DataGridView 忽略 DataGridviewCellStyle 中设置的字体设置。
  • 更新了 DataGridView 控件的内部滚动条的 AccessibleName 属性以删除文本“ScrollBar”。
  • 修复了选择单元格时 DataGridViewLinkCell 的颜色。
  • 修复了自定义 DataGridView 控件没有为自定义 DataGridViewCell 元素提供 ControlTypeLocalizedControlType 的问题。
  • ToolStripRenderMode 设置为 SystemToolStripButton 控件的亮度比更新为 3.5:1。
  • 改进了元素类型为 ToolStrip 时的键盘导航ToolStripComboBox
  • 更新了 ToolStripButton 在高对比度模式下的背景色。
  • 确保有一个边框报告给 ToolStripSeparator 的辅助技术。
  • 修复了读取 PropertyGrid 控件时可能导致屏幕阅读器 JAWS 崩溃的问题。
  • 确保在展开复杂条目(如 Font)时更新 PropertyGrid 控件的 UIA 层次结构树。 此外,还确保在条目折叠且不再可见时正确更新树。
  • PropertyGrid 类别现在具有本地化控件类型 PropertyGrid category
  • 修复了可能导致应用在 Windows 辅助功能见解下崩溃的 ComboBox 问题。
  • 更新了 Button 的边框颜色,使其在默认颜色中具有更多对比度。
  • 启用辅助技术工具以访问最大化 MDI 子窗体的 ControlBox 按钮。
  • DomainUpDown 控件的 AccessibleName 属性具有空字符串的新默认值。 空字符串将鼓励开发人员创建有意义的名称,而不是接受以前的非空默认值。
  • PrintPreviewDialog 中“打印”按钮的 AccessibleName 属性从“打印按钮”更新为“打印”,以避免屏幕阅读器播报控件及其类型时出现冗余。
  • 更新了 UIA 列表控件,以在 ComboBox 类型的 PropertyGrid 单元格关闭且不再可见时删除空列表元素。

Windows Presentation Foundation (WPF)

辅助工具提示处理改进

在此版本中,WPF 确保可以通过使用 Esc 键、Ctrl 键(本身)或组合 Ctrl+Shift+F10 轻松消除当前窗口中的工具提示,从而改进了体验。 在此版本中,Esc 键的范围缩小到仅适用于当前窗口,而此前该窗口适用于应用程序中的任何打开的工具提示。 默认情况下,WPF 工具提示将遵循 WCAG2.1 准则,以便持久保存、可消除和可悬停。

.NET Framework 4.8 的 2020 年 8 月 11 日累积更新中的新增辅助功能

.NET Framework 4.8 的 2020 年 8 月 11 日 KB4569746 累积更新包括 Windows 窗体中的新增辅助功能:

  • 解决屏幕阅读器播报 PropertyGrid 控制项和类别的展开/折叠状态的问题。

  • 更新 PropertyGrid 控件及其内部元素的可访问模式。

  • 更新 PropertyGrid 控件内部元素的可访问名称,使屏幕阅读器可正确播报这些名称。

  • 解决 PropertyGridView 控件的边框可访问属性的问题。

  • 使屏幕阅读器可以正确地播报 DataGridView 组合框单元格的展开/折叠状态。

.NET Framework 4.8 中辅助功能的新增功能

.NET Framework 4.8 在以下几个领域包含新增辅助功能:

Windows 窗体

在 .NET Framework 4.8 中,Windows 窗体将对 LiveRegions 和通知事件的支持添加到多个常用控件中。 它还会在用户使用键盘导航到控件时添加工具提示支持。

标签和 StatusStrips 中的 UIA LiveRegions 支持

UIA LiveRegions 允许应用程序开发人员将用户工作位置之外的某个控件中的文本更改通知给屏幕阅读器。 例如,对于显示连接状态的 StatusStrip 控件,这很有用。 如果连接断开且状态发生更改,开发人员可能会希望将此情况通知给屏幕阅读器。

从 .NET Framework 4.8 开始,Windows 窗体同时为 LabelStatusStrip 控件实现 UIA LiveRegions。 例如,以下代码在名为 label1Label 控件中使用 LiveRegion:

public Form1()
{
   InitializeComponent();
   label1.AutomationLiveSetting = AutomationLiveSetting.Polite;
}

…
Label1.Text = "Ready!";

无论用户在何处与应用程序交互,讲述人都会宣布“准备就绪”。

还可以将 UserControl 实现为 LiveRegion:

using System;
using System.Windows.Forms;
using System.Windows.Forms.Automation;

namespace WindowsFormsApplication
{
   public partial class UserControl1 : UserControl, IAutomationLiveRegion
   {
      public UserControl1()
      {
         InitializeComponent();
      }

      public AutomationLiveSetting AutomationLiveSetting { get; set; }
      private AutomationLiveSetting IAutomationLiveRegion.GetLiveSetting()
      {
         return this.AutomationLiveSetting;
      }

      protected override void OnTextChanged(EventArgs e)
      {
         base.OnTextChanged(e);
         AutomationNotifications.UiaRaiseLiveRegionChangedEvent(this.AccessibilityObject);
      }
   }
}

UIA 通知事件

Windows 10 Fall Creators Update 中引入的 UIA 通知事件允许应用程序引发 UIA 事件,这使得讲述人仅根据你为事件提供的文本来进行宣读,而无需在 UI 中使用相应的控件。 在某些情况下,这是一种能够显着改善应用辅助功能的简单方法。 也可以用于通知可能需要很长时间的某些进程的进度。 有关 UIA 通知事件的详细信息,请参阅桌面应用程序是否可以利用新的 UI 通知事件?

下面的示例会引发通知事件

MethodInfo raiseMethod = typeof(AccessibleObject).GetMethod("RaiseAutomationNotification");
if (raiseMethod != null) {
   raiseMethod.Invoke(progressBar1.AccessibilityObject, new object[3] {/*Other*/ 4, /*All*/ 2, "The progress is 50%." });
}

键盘访问工具提示

在面向 .NET Framework 4.7.2 及更早版本的应用程序中,只能通过将鼠标指针移到控件上,才能触发控件工具提示。 从 .NET Framework 4.8 开始,键盘用户可以通过使用 Tab 键或箭头键(具有或不具有修饰键)来聚焦控件,从而触发控件的工具提示。 要实现这一特定的辅助功能优化效果,需要额外的 AppContext 开关

<?xml version="1.0" encoding="utf-8"?>
<configuration>
   <startup>
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
   </startup>
   <runtime>
      <!-- AppContextSwitchOverrides values are in the form of key1=true|false;key2=true|false  -->
      <!-- Please note that disabling Switch.UseLegacyAccessibilityFeatures, Switch.UseLegacyAccessibilityFeatures.2 and Switch.UseLegacyAccessibilityFeatures.3 is required to disable Switch.System.Windows.Forms.UseLegacyToolTipDisplay -->
      <AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false;Switch.UseLegacyAccessibilityFeatures.3=false;Switch.System.Windows.Forms.UseLegacyToolTipDisplay=false"/>
   </runtime>
</configuration>

下图显示用户使用键盘选中按钮时的工具提示。

Screenshot of tooltip when user navigates to button with the keyboard.

Windows Presentation Foundation (WPF)

从 .NET Framework 4.8 开始,WPF 包括大量辅助功能改进。

屏幕讲述人不再宣读可见性为“折叠”或“隐藏”的元素

可见性为“折叠”或“隐藏”的元素不再被屏幕讲述人宣读。 如果向用户宣读包含可见性为 Visibility.CollapsedVisibility.Hidden 的元素的用户界面,屏幕阅读器可能会错误呈现这些界面。 从 .NET Framework 4.8 开始,WPF 不再在 UIAutomation 树的控制视图中包含折叠或隐藏的元素,屏幕阅读器无法再宣读这些元素。

与非基于修饰器的文本选择配合使用的 SelectionTextBrush 属性

在 .NET Framework 4.7.2 中,WPF 添加了无需使用修饰器层即可绘制 TextBoxPasswordBox 文本选择的功能。 此方案中所选文本的前景色由 SystemColors.HighlightTextBrush 决定。

.NET Framework 4.8 添加了一个新属性 SelectionTextBrush,允许开发人员在使用非基于修饰器的文本选择时为所选文本选择特定画笔。 此属性仅适用于 TextBoxBase 派生的控件和启用了非基于修饰器的文本选择功能的 WPF 应用程序中的 PasswordBox 控件。 该属性不适用于 RichTextBox 控件。 如果未启用非基于修饰器的文本选择功能,则忽略此属性。

要使用此属性,只需将其添加到 XAML 代码,并使用适当的画笔或绑定。 生成的文本选择如下所示:

Screenshot of the app running with the words Hello World selected.

可以结合使用 SelectionBrushSelectionTextBrush 属性来生成你认为合适的任何背景色和前景色组合。

对 UIAutomation ControllerFor 属性的支持

UIAutomation 的 ControllerFor 属性返回一系列由支持该属性的自动化元素操纵的自动化元素。 此属性通常用于自动建议辅助功能。 应在自动化元素会影响应用程序 UI 或桌面的一个或多个段时使用 ControllerFor。 否则,很难将控制操作的影响与 UI 元素关联。 此功能增加了控件为 ControllerFor 属性提供值的功能。

.NET framework 4.8 添加了新的虚拟方法 GetControlledPeersCore()。 要为 ControllerFor 属性提供值,只需替代此方法并为此 AutomationPeer 操作的控件返回 List<AutomationPeer>

public class AutoSuggestTextBox: TextBox
{
   protected override AutomationPeer OnCreateAutomationPeer()
   {
      return new AutoSuggestTextBoxAutomationPeer(this);
   }

   public ListBox SuggestionListBox;
}

internal class AutoSuggestTextBoxAutomationPeer : TextBoxAutomationPeer
{
   public AutoSuggestTextBoxAutomationPeer(AutoSuggestTextBox owner) : base(owner)
   {
   }

   protected override List<AutomationPeer> GetControlledPeersCore()
   {
      List<AutomationPeer> controlledPeers = new List<AutomationPeer>();
      AutoSuggestTextBox owner = Owner as AutoSuggestTextBox;
      controlledPeers.Add(UIElementAutomationPeer.CreatePeerForElement(owner.SuggestionListBox));
      return controlledPeers;
   }
}

键盘访问工具提示

在 .NET Framework 4.7.2 和更早版本中,仅当用户将鼠标光标悬停在控件上时,系统才会显示工具提示。 在 .NET Framework 4.8 中,工具提示还会在键盘聚焦时显示,也可以通过键盘快捷方式显示。

要启用此功能,应用程序需要面向 .NET Framework 4.8,或使用 Switch.UseLegacyAccessibilityFeatures.3Switch.UseLegacyToolTipDisplayAppContext 开关来选择加入。 下面是一个示例应用程序配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <startup>
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
   </startup>
   <runtime>
      <AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false;Switch.UseLegacyAccessibilityFeatures.3=false;Switch.UseLegacyToolTipDisplay=false" />
   </runtime>
</configuration>

启用后,一旦控件接收到键盘焦点,包含工具提示的所有控件都会显示工具提示。 随时间推移或当键盘焦点发生变化时,可关闭工具提示。 用户还可以通过使用新的键盘快捷键 Ctrl+Shift+F10 手动关闭工具提示。 关闭工具提示后,可以使用相同的键盘快捷键再次显示。

注意

Ribbon 控件上的功能区工具提示不在键盘聚焦时显示;它们仅通过键盘快捷键显示。

添加了对 SizeOfSet 和 PositionInSet UIAutomation 属性的支持

Windows 10 引入了两个新的 UIAutomation 属性(SizeOfSetPositionInSet),应用程序用其描述集合中的项数。 然后,UIAutomation 客户端应用程序(如屏幕阅读器)可以向某个应用程序查询这些属性,并宣布应用程序 UI 的准确表示形式。

从 .NET Framework 4.8 开始,WPF 向 WPF 应用程序中的 UIAutomation 公开这两个属性。 这可以通过以下两种方式实现:

  • 通过使用依赖项属性。

    WPF 添加了两个新的依赖项属性:AutomationProperties.SizeOfSetAutomationProperties.PositionInSet。 开发人员可以使用 XAML 来设置它们的值:

    <Button AutomationProperties.SizeOfSet="3"
      AutomationProperties.PositionInSet="1">Button 1</Button>
    
    <Button AutomationProperties.SizeOfSet="3"
      AutomationProperties.PositionInSet="2">Button 2</Button>
    
    <Button AutomationProperties.SizeOfSet="3"
      AutomationProperties.PositionInSet="3">Button 3</Button>
    
  • 通过替代 AutomationPeer 虚拟方法。

    GetSizeOfSetCore()GetPositionInSetCore() 虚拟方法已添加到 AutomationPeer 类中。 开发人员可以通过替代这些方法为 SizeOfSetPositionInSet 提供值,如以下示例所示:

    public class MyButtonAutomationPeer : ButtonAutomationPeer
    {
      protected override int GetSizeOfSetCore()
      {
          // Call into your own logic to provide a value for SizeOfSet
          return CalculateSizeOfSet();
      }
    
      protected override int GetPositionInSetCore()
      {
          // Call into your own logic to provide a value for PositionInSet
          return CalculatePositionInSet();
      }
    }
    

此外,开发人员无需执行其他操作,ItemsControl 实例中的项会自动为这些属性提供值。 如果将 ItemsControl 归组,则组的集合表示为一个集,并且每个组计为一个单独的集,该组内的每个项提供其在该组内的位置以及该组的大小。 虚拟化不会影响自动值。 即使没有实现某个项,它仍然会计入集的总大小,并影响其在同级项集中的位置。

仅当应用程序面向 .NET Framework 4.8 时,才会提供自动值。 对于面向 .NET Framework 早期版本的应用程序,可以设置 Switch.UseLegacyAccessibilityFeatures.3AppContext 开关,如以下 App.config 文件中所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <startup>
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
   </startup>
   <runtime>
      <AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false;Switch.UseLegacyAccessibilityFeatures.3=false" />
   </runtime>
</configuration>

Windows Workflow Foundation (WF) 工作流设计器

.NET Framework 4.8 中的工作流设计器包含以下更改:

  • 使用讲述人的用户将体验到 FlowSwitch 事例标签的改进。

  • 使用讲述人的用户将体验到按钮描述的改进。

  • 选择高对比度主题的用户将看到工作流设计器及其控件可见性方面的改进,例如元素间的对比度效果更好和用于焦点元素的更明显的选择框。

如果应用程序面向 .NET Framework 4.7.2 或更早版本,则可以通过在应用程序配置文件中将Switch.UseLegacyAccessibilityFeatures.3 AppContext 开关设置为 false 来选择这些更改。 有关详细信息,请参阅本文中的利用辅助功能改进部分。

.NET Framework 4.7.2 中辅助功能的新增功能

.NET Framework 4.7.2 在以下几个领域包含新增辅助功能:

Windows 窗体

高对比度主题中的 OS 定义的颜色

自 .NET Framework 4.7.2 起,Windows 窗体使用高对比度主题中的操作系统定义的颜色。 这会影响以下控件:

讲述人改进

自 .NET Framework 4.7.2 起,讲述人支持在以下几个方面改进:

DataGridView 改进

自 .NET Framework 4.7.2 起,DataGridView 控件引入了以下辅助功能改进:

改进了视觉提示

改进了属性网格支持

改进了的键盘导航

Windows Presentation Foundation (WPF)

对复选框和单选按钮控件的更改

在 .NET Framework 4.7.1 和更低版本中,WPF System.Windows.Controls.CheckBoxSystem.Windows.Controls.RadioButton 控件不一致且在经典和高对比度主题中具有不正确的焦点视觉对象。 控件没有内容集时会出现这些问题。 这会使得主题间的转换变得混乱且难以看到焦点视觉对象。

现在,在 .NET Framework 4.7.2 中,主题间的这些视觉对象更加一致,并且在经典和高对比度主题中更轻松可见。

在 WPF 应用程序中托管的 WinForms 控件

对于 .NET Framework 4.7.1 和更低版本中的 WPF 应用程序托管的 WinForms 控件,如果该层中的第一个或最后一个控件是 WPF ElementHost 控件,那么用户不能按 Tab 退出 WinForms 层。 现在,在 .NET Framework 4.7.2 中,用户能够按 Tab 退出 WinForms 层。

但是,依赖于永不转义 WinForms 层的焦点的自动化应用程序不再会按预期工作。

.NET Framework 4.7.1 中辅助功能的新增功能

.NET Framework 4.7.1 在以下几个领域包含新增辅助功能:

Windows Presentation Foundation (WPF)

屏幕阅读器改进

如果启用了辅助功能改进,.NET Framework 4.7.1 包括以下可影响屏幕阅读器的增强功能:

  • 在 .NET Framework 4.7 及更低版本中,Expander 控件由屏幕阅读器宣称为按钮。 从 .NET Framework 4.7.1 开始,它们被正确地称为可展开/可折叠组。

  • 在 .NET Framework 4.7 及更低版本中,DataGridCell 控件由屏幕阅读器宣称为“自定义”。 从 .NET Framework 4.7.1 开始,它们被正确地称为数据网格单元格(已本地化)。

  • 从 .NET Framework 4.7.1 开始,屏幕阅读器宣布可编辑 ComboBox 的名称。

  • 在 .NET Framework 4.7 及更低版本中,PasswordBox 控件被宣称为“视图中没有任何项”或有其他错误行为。 此问题已在 .NET Framework 4.7.1 及更高版本中解决。

UIAutomation LiveRegion 支持

屏幕阅读器(如讲述人)可帮助用户阅读应用程序的 UI 内容,通常通过具有焦点的 UI 内容的文本到语音转换输出实现。 但是,如果 UI 元素更改,并且不具有焦点,则用户可能不会收到通知,并且可能会错过重要信息。 活动区域旨在解决此问题。 开发人员可使用它们来通知屏幕阅读器或任何其他 UIAutomation 客户端 UI 元素有重要更改。 然后,屏幕阅读器可确定向用户通知此更改的方式和时间。

为了支持活动区域,向 WPF 添加了以下 API:

可通过对相关元素设置 AutomationProperties.LiveSetting 属性来创建 LiveRegion,如以下示例所示:

<TextBlock Name="myTextBlock" AutomationProperties.LiveSetting="Assertive">announcement</TextBlock>

活动区域中的数据发生更改,并且需要通知屏幕阅读器时,可显式引发事件,如以下示例所示。

var peer = FrameworkElementAutomationPeer.FromElement(myTextBlock);

peer.RaiseAutomationEvent(AutomationEvents.LiveRegionChanged);
Dim peer = FrameworkElementAutomationPeer.FromElement(myTextBlock)
peer.RaiseAutomationEvent(AutomationEvents.LiveRegionChanged)

高对比度

从 .NET Framework 4.7.1 开始,对多种 WPF 控件进行了高对比度改进。 可在设置 HighContrast 主题后看到这些改进。 这些方法包括:

  • Expander 控件

    Expander 控件的焦点视觉对象现在可见。 ComboBoxListBoxRadioButton 控件的键盘视觉对象也可见。 例如:

    在此之前:

    Screenshot of the expander control with focus and no focus visual.

    之后:

    Screenshot of the expander control with focus showing a dotted line around the control's text.

  • CheckBoxRadioButton 控件

    在高对比度主题下选中时,CheckBoxRadioButton 控件中的文本更易于查看。 例如:

    在此之前:

    Screenshot of radio and check buttons with poor text visibility on high contrast themes.

    之后:

    Screenshot of radio and check buttons with better text visibility on high contrast themes.

  • ComboBox 控件

    从 .NET Framework 4.7.1 开始,已禁用的 ComboBox 控件的边框与禁用的文本颜色相同。 例如:

    在此之前:

    Screenshot of a disabled ComboBox with border and control text in different colors.

    之后:

    Screenshot of a disabled ComboBox with border the same color as the control text.

    此外,已禁用的按钮和具有焦点的按钮使用正确的主题颜色。

    在此之前:

    Screenshot of a black button with gray text saying Focus Me.

    之后:

    Screenshot of a blue button with black text saying Focus Me.

    最后,在 .NET Framework 4.7 及更低版本中,将 ComboBox 控件的样式设置为 Toolbar.ComboBoxStyleKey 会导致下拉箭头不可见。 此问题已在 .NET Framework 4.7.1 及更高版本中解决。 例如:

    在此之前:

    Screenshot of a ComboBox control with an invisible drop-down arrow.

    之后:

    Screenshot of a ComBoxBox control displaying the drop-down arrow.

  • DataGrid 控件

    从 .NET Framework 4.7.1 开始,DataGrid 控件中的排序指示符箭头现在使用正确的主题颜色。 例如:

    在此之前:

    Screenshot of sort indicator arrow before improvements.

    之后:

    Screenshot of sort indicator arrow after improvements.

    此外,在 .NET Framework 4.7 及更低版本中,在高对比度模式下,默认链接样式在鼠标悬停在其上时更改为不正确的颜色。 此问题已在 .NET Framework 4.7.1 及更高版本中解决。 同样,从 .NET Framework 4.7.1 开始,DataGrid 复选框列对键盘焦点反馈使用预期的颜色。

    在此之前:

    Screenshot of a link saying Click Me! in red.

    之后:

    Screenshot of a link saying Click Me! in yellow.

有关 .NET Framework 4.7.1 中 WPF 辅助功能改进的详细信息,请参阅 WPF 辅助功能改进

Windows 窗体辅助功能改进

在 .NET Framework 4.7.1 中,Windows 窗体 (WinForms) 包括以下几个方面的辅助功能改进。

改进了高对比度模式下的显示

从 .NET Framework 4.7.1 开始,多种 WinForms 控件改进了高对比度模式下在操作系统中的呈现方式。 Windows 10 更改了一些高对比度系统颜色的值,而 Windows 窗体基于 Windows 10 Win32 框架。 为获得最佳体验,请运行最新版本的 Windows,并通过在测试应用程序中添加 app.manifest 文件选择使用最新的 OS 更改,同时取消注释 Windows 10 支持的 OS 行,最终结果如下所示:

<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />

高对比度更改的一些示例包括:

  • MenuStrip 项中的复选标记更易于查看。

  • 选中后,禁用的 MenuStrip 项更易于查看。

  • 所选 Button 控件中的文本与选中颜色形成鲜明对比。

  • 禁用的文本更易于阅读。 例如:

    在此之前:

    Screenshot of an app that uses different controls running in high contrast mode before accessibility improvements.

    之后:

    Screenshot of an app that uses different controls running in high contrast mode after accessibility improvements.

  • “线程异常”对话框中的高对比度改进。

改进了讲述人支持

.NET Framework 4.7.1 中的 Windows 窗体对讲述人进行了以下辅助功改进:

  • 讲述人以及其他 UI 自动化工具可访问 MonthCalendar 控件。

  • 当某个项的选中状态更改时,CheckedListBox 控件会通知讲述人,因此用户可获知更改了列表项的值。

  • DataGridViewCell 控件向讲述人报告正确的只读状态。

  • 讲述人现在可以阅读已禁用的 ToolStripMenuItem 文本,而以前它会跳过禁用的菜单项。

增强了对 UIAutomation 辅助功能模式的支持

从 .NET Framework 4.7.1 开始,辅助功能技术工具的开发人员可以利用常见的 API 辅助功能模式和多个 WinForms 控件的属性。 这些辅助功能改进包括:

改进了属性浏览器体验

从 .NET Framework 4.7.1 开始,Windows 窗体包括以下改进:

  • 更好地通过各种下拉选择窗口使用键盘导航。
  • 减少不必要的制表位。
  • 更好地报告控件类型。
  • 改进了讲述人行为。

ASP.NET Web 控件

自 .NET Framework 4.7.1 和 Visual Studio 2017 版本 15.3 起,ASP.NET 改进了 ASP.NET Web 控件与 Visual Studio 中的辅助功能技术配合使用的方式。 包括以下更改:

  • 在以下控件中实现缺失 UI 的辅助功能模式:例如“详细信息视图”向导中的“添加字段”对话框或“ListView”向导的“配置 ListView”对话框 。

  • 改善在高对比度模式下(如“数据页导航字段编辑器”)的显示。

  • 改善以下控件的键盘导航体验:例如 DataPager 控件的“编辑页导航字段”向导中的“字段”对话框、“配置 ObjectContext”对话框或“配置数据源”向导的“配置数据选择”对话框 。

.NET SDK 工具

配置编辑器工具 (SvcConfigEditor.exe)服务跟踪查看器工具 (SvcTraceViewer.exe) 通过修复各种辅助功能问题得到改进。 其中大多数都是一些小问题,如未定义名称或未正确实现某些 UI 自动化模式。 虽然许多用户不会意识到这些小问题的重要性,但使用屏幕阅读器等辅助技术的客户会发现这些 SDK 工具更易于访问。

这些改进更改了某些旧行为,例如键盘焦点顺序。

Windows Workflow Foundation (WF) 工作流设计器

工作流设计器中的辅助功能更改包括:

  • 某些控件中 Tab 键顺序更改为从左到右以及从上到下:

  • 通过键盘可以使用更多功能:

    • 编辑活动的属性时,属性组在第一次聚焦时可以通过键盘折叠。

    • 警告图标可以通过键盘访问。

    • “属性”窗口的“更多属性”按钮可以通过键盘访问 。

    • 键盘用户可以访问工作流设计器“参数”和“变量”窗格的标题项 。

  • 提升了聚焦项的可见性,例如当:

    • 将行添加到工作流设计器和活动设计器使用的数据网格。

    • ReceiveReplySendReply 活动中按 Tab 键切换字段。

    • 设置变量或自变量的默认值

  • 屏幕读取器现在可以正确识别:

    • 工作流设计器中设置的断点。

    • FlowSwitch<T>FlowDecisionCorrelationScope 活动。

    • Receive 活动的内容。

    • InvokeMethod 活动的目标类型。

    • TryCatch 活动中的“异常”组合框和“最终”部分。

    • 消息传递活动(ReceiveSendSendReplyReceiveReply)中的“消息类型”组合框、“添加相关初始化表达式”窗口中的拆分器、“内容定义”窗口和“CorrelatesOn 定义”窗口。

    • 状态机转换和转换目标。

    • FlowDecision 活动上的注释和连接器。

    • 活动的上下文(右键单击)菜单。

    • 属性值编辑器、“清除搜索”按钮、“按类别”和“按字母顺序”排序按钮以及属性网格中的“表达式编辑器”对话框。

    • 工作流设计器中的缩放百分比。

    • ParallelPick 活动中的分隔符。

    • InvokeDelegate 活动。

    • 字典活动(Microsoft.Activities.AddToDictionary<TKey,TValue>Microsoft.Activities.RemoveFromDictionary<TKey,TValue> 等)的“选择类型”窗口。

    • “浏览和选择 .NET 类型”窗口。

    • 工作流设计器中的痕迹导航。

  • 选择高对比度主题的用户将看到工作流设计器及其控件可见性的许多改进,例如元素间更好的对比度和焦点元素更明显的选择框。

请参阅