.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>元素内。 以下是支持的开关:
| 版本 | 开关 |
|---|---|
| .NET Framework 4.7.1 | “Switch.UseLegacyAccessibilityFeatures” |
| .NET Framework 4.7.2 | “Switch.UseLegacyAccessibilityFeatures.2” |
| .NET Framework 4.8 | “Switch.UseLegacyAccessibilityFeatures.3” |
| 2020 年 8 月 11 日-KB4569746 .NET Framework 4.8 累积更新 | 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 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 和 2020 年 8 月 .NET Framework 4.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 开始的应用程序,可以通过在应用程序的配置文件中 <AppContextSwitchOverrides> 部分的 <runtime> 元素中加入开关,并将其值设置为 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 时,已实现通用控件的所有必需模式。 此新功能为用户提供了更丰富的应用程序交互体验。此新功能为用户提供了更丰富的辅助技术。
- 向控件添加了对 UIA 展开/折叠模式 DateTimePicker 的支持。
- 向 MonthCalendar 控件添加了 UIA 支持。 现在,辅助技术工具(如讲述人)可以浏览控件中的单个日期。
- 实现了对所有基于文本的控件(包括TextBox、MaskedTextBoxPropertyGrid编辑控件、DataGridViewTextBoxCellToolStripTextBox控件和DomainUpDown控件)的文本模式支持。
- ToolTip 现在遵循 WCAG2.1 准则 ,在 Windows 11 上持久、可消除和可悬停。 对工具提示行为的更改仅限于安装了 .NET Framework 4.8.1 的 Windows 11 系统,并且仅适用于未为工具提示设置超时的应用程序。 可以使用 Esc 键或 Ctrl 键或通过导航到具有另一个工具提示集的控件来消除保留的工具提示。
对现有辅助功能的各种 bug 的修复
- 讲述人现在可以专注于空 DataGridView 控件。
- 解决了在控件中 DataGridView 宣布列计数时导致屏幕阅读器对隐藏列进行计数的问题。
- 解决了一个问题:当基础窗体具有不同于
Font的DefaultFont属性时,DataGridView会忽略在DataGridviewCellStyle中设置的字体设置。 - 更新了
AccessibleName控件DataGridView的内部滚动条的属性以删除文本“ScrollBar”。 - 修复了选择单元格时的颜色
DataGridViewLinkCell。 - 修复了一个问题,即自定义DataGridView控件未为自定义DataGridViewCell元素提供
ControlType或LocalizedControlType。 - 将亮度比率更新为 3.5:1,适用于设置为
ToolStripRenderModeSystem的 ToolStripButton 控件。 - 当元素为
ToolStripComboBox类型时改进了ToolStrip中的键盘导航。 - 已更新高对比度模式下 ToolStripButton 的背景色。
- 确保为ToolStripSeparator报告一个边界矩形以供辅助技术使用。
- 修复了读取PropertyGrid控件时可能导致屏幕阅读器JAWS崩溃的一个问题。
- 确保在展开复杂条目
Font时更新PropertyGrid控件的UIA层次结构树。 此外,还确保当条目折叠且不再可见时,树已正确更新。 -
PropertyGrid 类别现在具有本地化的
PropertyGrid category控件类型。 - 修复了 ComboBox 可能导致应用在适用于 Windows 的辅助功能见解下崩溃的问题。
- 更新了边框颜色,使其 Button 在默认颜色中具有更多对比度。
- 已启用辅助技术工具以访问最大化 MDI 子窗体的
ControlBox按钮。 - 控件
AccessibleName的属性 DomainUpDown 具有空字符串的新默认值。 空字符串将鼓励开发人员创建有意义的名称,而不是接受以前的非空默认值。 - 将PrintPreviewDialog中名为“打印按钮”的属性更新为“打印”以避免在屏幕阅读器朗读控件及其类型时造成冗余。
- 更新了 UIA 列表控件,以在关闭类型PropertyGrid单元格并且不再可见后删除空列表元素。
Windows Presentation Foundation (WPF)
辅助功能工具提示处理改进
在此版本中,WPF 通过使用 Esc 键、Ctrl 键(本身)或组合 Ctrl+Shift+F10 轻松消除当前窗口中的工具提示,从而改进了体验。 在此版本中,Esc 键的作用范围已缩小,只应用于当前窗口,而不是像之前那样应用于应用程序中的任何打开的工具提示。 默认情况下,WPF 工具提示将遵循 WCAG2.1 准则 ,以持久、可消除和可悬停。
2020 年 8 月 11 日发布的 .NET Framework 4.8 累积更新中的无障碍功能更新内容
2020 年 8 月 11 日KB4569746 .NET Framework 4.8 累积更新包括 Windows 窗体中的新增辅助功能:
解决了屏幕阅读器宣布
PropertyGrid控件项和类别的展开/折叠状态的问题。更新
PropertyGrid控件和其内部元素的可访问性模式。更新控件内部元素的
PropertyGrid可访问名称,以便屏幕阅读器正确宣布它们。解决了控件的边界矩形可访问属性
PropertyGridView。使屏幕阅读器能够正确报出组合框单元格的
DataGridView展开/折叠状态。
.NET Framework 4.8 中无障碍功能的新增内容
.NET Framework 4.8 在以下几个方面引入了新的可访问性功能:
Windows 窗体
在 .NET Framework 4.8 中,Windows 窗体向许多常用控件添加了对 LiveRegions 和通知事件的支持。 当用户使用键盘导航到控件时,它还增加了对工具提示的支持。
标签和状态条中的 UIA LiveRegions 支持
UIA LiveRegions 允许应用程序开发人员通知屏幕阅读器,某个与用户当前操作位置分离的控件中发生的文本更改。 例如,对于显示连接状态的 StatusStrip 控件,这非常有用。 如果连接已删除并且状态发生更改,开发人员可能希望通知屏幕阅读器。
从 .NET Framework 4.8 开始,Windows 窗体在 Label 和 StatusStrip 控件中实施 UIA LiveRegions。 例如,以下代码在名为 Label 的label1控件中使用 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>
下图显示了当用户选择了带有键盘的按钮时的工具提示。
Windows Presentation Foundation (WPF)
从 .NET Framework 4.8 开始,WPF 包括许多无障碍功能改进。
屏幕朗读器不再宣布具有折叠或隐藏可见性的元素
屏幕阅读器不再宣布具有折叠或隐藏可见性的元素。 界面中包含可见性为 Visibility.Collapsed 或 Visibility.Hidden 的元素,如果这些元素被屏幕阅读器播报可能会被误读。 从 .NET Framework 4.8 开始,WPF 不再在 UIAutomation 树的控件视图中包括折叠或隐藏的元素,因此屏幕阅读器无法再读出这些元素。
SelectionTextBrush 属性,用于基于非装饰器的文本选择
在 .NET Framework 4.7.2 中,WPF 添加了在不使用装饰器层的情况下绘制 TextBox 和 PasswordBox 文本选择的功能。 在这种情况下,所选文本的前景色由 SystemColors.HighlightTextBrush 决定。
.NET Framework 4.8 添加了一个新属性, SelectionTextBrush允许开发人员在使用基于非装饰器的文本选择时为所选文本选择特定的画笔。 在启用了基于非装饰器的文本选择的 WPF 应用程序中,此属性仅适用于 TextBoxBase 派生控件和 PasswordBox 控件。 它不适用于 RichTextBox 控件。 如果未启用基于装饰器的文本选择,则忽略此属性。
若要使用此属性,只需将其添加到 XAML 代码并使用相应的画笔或绑定即可。 生成的文本选择如下所示:
你可以组合使用 SelectionBrush 和 SelectionTextBrush 属性来生成你认为合适的任何背景和前景颜色组合。
支持 UIAutomation ControllerFor 属性
UIAutomation 的属性 ControllerFor 返回一个自动化元素数组,这些元素是由支持此属性的自动化元素操控的。 此属性通常用于自动建议的可访问性功能。
ControllerFor 当自动化元素影响应用程序 UI 或桌面的一个或多个段时使用。 否则,很难将控制操作的影响与 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.3 和 Switch.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 属性,SizeOfSet 和 PositionInSet,它们被应用程序用来描述集合中项的计数。 然后,UIAutomation 客户端应用程序(如屏幕阅读器)可以查询应用程序以获取这些属性,并公布应用程序的 UI 的准确表示形式。
从 .NET Framework 4.8 开始,WPF 在 WPF 应用程序中向 UIAutomation 公开这两个属性。 这可以通过两种方式实现:
通过使用依赖属性。
WPF 添加了两个新的依赖项属性, AutomationProperties.SizeOfSet 以及 AutomationProperties.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.3AppContext 开关 设置为 false 来启用这些更改。 有关详细信息,请参阅本文中的“利用辅助功能的改进”部分。
.NET Framework 4.7.2 中无障碍功能的新增功能
.NET Framework 4.7.2 在以下几个方面包括新的无障碍功能:
Windows 窗体
高对比度主题中的 OS 定义颜色
从 .NET Framework 4.7.2 开始,Windows 窗体使用由操作系统在高对比度主题中定义的颜色。 这会影响以下控件:
控件的 ToolStripDropDownButton 下拉箭头。
设置为FlatStyle或FlatStyle.Flat的Button、RadioButton和CheckBox控件。 以前,所选文本和背景色没有对比,难以阅读。
在高对比度模式下,ToolStripButton、ToolStripComboBox和ToolStripDropDownButton控件的亮度对比度比增加。
旁白功能改进
从 .NET Framework 4.7.2 开始,讲述人支持将得到增强,如下所示:
它在宣布ToolStripMenuItem的文本时公布其ToolStripMenuItem.ShortcutKeys属性的值。
它指示何时 ToolStripMenuItem 将属性 Enabled 设置为
false.当 ListView.CheckBoxes 属性设置为
true时,它会提供关于复选框状态的反馈。讲述人的“扫描模式”焦点顺序与 ClickOnce 下载对话框窗口中控件的视觉顺序一致。
DataGridView 改进
从 .NET Framework 4.7.2 开始,控件 DataGridView 引入了以下辅助功能改进:
可以使用键盘对行进行排序。 用户可以使用 F3 键按当前列进行排序。
可以使用 Alt + 向左/向右键 增加或减少当前单元格的列宽。
设置 DataGridView.SelectionMode 为 DataGridViewSelectionMode.FullRowSelect时,当用户在当前行的单元格之间通过按Tab键移动时,列标题将更改颜色,以指示当前列。
AccessibleObject.Parent的System.Windows.Forms.DataGridViewLinkCell.DataGridViewLinkCellAccessibleObject属性返回正确的父控件。
改进的视觉提示
- RadioButton和CheckBox这两个控件,如果Text属性为空,在接收焦点时会显示焦点指示器。
改进了属性网格支持
PropertyGrid控件子元素现在仅在启用 PropertyGrid 元素时才返回IsReadOnlyProperty该属性。
当且仅当用户可以更改 PropertyGrid 元素时,PropertyGrid 控件的子元素才会返回
false用于 IsEnabledProperty 属性。
改进了键盘导航
-
ToolStripButton 控件在其包含于属性 TabStop 设置为
true的 ToolStripPanel 中时允许获取焦点。
Windows Presentation Foundation (WPF)
CheckBox 和 RadioButton 控件的更改
在 .NET Framework 4.7.1 及更早版本中,WPF System.Windows.Controls.CheckBox 和 System.Windows.Controls.RadioButton 控件不一致,在经典和高对比度主题中,焦点视觉对象不正确。 如果控件没有任何内容集,则会出现这些问题。 这会使主题之间的切换变得令人困惑和焦点视觉对象难以看到。
在 .NET Framework 4.7.2 中,这些视觉对象现在在主题中更加一致,在经典和高对比度主题中更易于查看。
在 WPF 应用程序中托管的 WinForms 控件
对于在 .NET Framework 4.7.1 及更早版本中的 WPF 应用程序中托管的 WinForms 控件,如果该层中的第一个或最后一个控件是 WPF ElementHost 控件,则用户无法退出 WinForms 层。 在 .NET Framework 4.7.2 中,用户现在可以退出 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 元素进行了重要更改。 然后,屏幕阅读器可以决定如何以及何时通知用户此更改。
为了支持实时区域,已将以下 API 添加到 WPF:
AutomationElementIdentifiers.LiveSettingProperty和AutomationElementIdentifiers.LiveRegionChangedEvent字段标识
LiveSetting属性和LiveRegionChanged事件。 可以使用 XAML 设置它们。AutomationProperties.LiveSetting 附加属性,该属性用于通知屏幕阅读器 UI 更改对用户的重要性。
用于标识AutomationProperties.LiveSetting附加属性的AutomationProperties.LiveSettingProperty属性。
该AutomationPeer.GetLiveSettingCore方法可以被重写来提供一个
LiveSetting值。获取和设置
LiveSetting值的方法AutomationProperties.GetLiveSetting和AutomationProperties.SetLiveSetting。枚举 System.Windows.Automation.AutomationLiveSetting ,它定义以下可能
LiveSetting的值:AutomationLiveSetting.Off。 如果实时区域的内容已更改,该元素不会发送通知。
AutomationLiveSetting.Polite。 如果实时区域的内容已更改,该元素将发送非中断通知。
AutomationLiveSetting.Assertive。 如果实时区域的内容已更改,该元素将发送中断性通知。
可以通过在感兴趣的元素上设置 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 控件的焦点视觉现在可见。 控件ComboBox、ListBox和RadioButton的键盘视觉对象也可见。 例如:
之前:
After:
CheckBox 和 RadioButton 控件
现在,当在高对比度主题中选择时,控件中的CheckBoxRadioButton文本更易于查看。 例如:
之前:
After:
ComboBox 控制
从 .NET Framework 4.7.1 开始,禁用 ComboBox 控件的边框与禁用文本的颜色相同。 例如:
之前:
After:
此外,禁用和聚焦的按钮使用正确的主题颜色。
之前:
After:
最后,在 .NET Framework 4.7 及更早版本中,将控件的样式设置为ComboBox
Toolbar.ComboBoxStyleKey使下拉箭头不可见。 此问题从 .NET Framework 4.7.1 开始修复。 例如:之前:
After:
DataGrid 控制
从 .NET Framework 4.7.1 开始,控件中的 DataGrid 排序指示器箭头现在使用正确的主题颜色。 例如:
之前:
After:
此外,在 .NET Framework 4.7 和更早版本中,默认链接样式在高对比度模式下更改为鼠标上的错误颜色。 这是从 .NET Framework 4.7.1 开始解决的。 同样, DataGrid 复选框列使用从 .NET Framework 4.7.1 开始的键盘焦点反馈的预期颜色。
之前:
After:
有关 .NET Framework 4.7.1 中 WPF 辅助功能改进的详细信息,请参阅 WPF 中的辅助功能改进。
Windows 窗体可访问性改进
在 .NET Framework 4.7.1 中,Windows 窗体(WinForms)在以下方面包括可访问性更改。
改进了高对比度模式下的显示
从 .NET Framework 4.7.1 开始,各种 WinForms 控件在操作系统中提供的 HighContrast 模式下有更好的呈现效果。 Windows 10 已更改某些高对比度系统颜色的值,Windows 窗体基于 Windows 10 Win32 框架。 为了获得最佳体验,请在最新版本的 Windows 上运行,并通过在测试应用程序中添加 app.manifest 文件并取消注释 Windows 10 支持的操作系统行,启用最新的操作系统更改,使其如下所示:
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
高对比度更改的一些示例包括:
带有 MenuStrip 的项目中的复选标记更易于查看。
选中后,禁用 MenuStrip 的项目更易于查看。
所选 Button 控件中的文本与选择颜色形成对比。
禁用的文本更易于阅读。 例如:
之前:
After:
线程异常对话框中的高对比度优化。
改进了讲述人支持
.NET Framework 4.7.1 中的 Windows 窗体为讲述人提供了以下无障碍功能改进:
MonthCalendar该控件可由讲述人和其他 UI 自动化工具访问。
控件 CheckedListBox 在项的检查状态发生更改时通知讲述人,以便通知用户他们已更改列表项的值。
该 DataGridViewCell 控件将正确的只读状态报告给讲述人。
讲述人现在可以读取禁用 ToolStripMenuItem 的文本,而以前,它将跳过禁用的菜单项。
增强了对 UIAutomation 辅助功能模式的支持
从 .NET Framework 4.7.1 开始,辅助功能技术工具的开发人员可以利用多个 WinForms 控件的常见 API 辅助功能模式和属性。 这些辅助功能改进包括:
现在 DataGridViewCheckBoxCell 支持 切换模式。
该 ToolStripItem 控件支持 Name 属性和 展开/折叠模式。
控件NumericUpDownDomainUpDown支持该Name属性。
改进了属性浏览器体验
自 .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 控件的“编辑页导航字段”向导中的“字段”对话框、“配置对象文本”对话框或“配置数据源”向导的“配置数据选择”对话框。
.NET SDK 工具
通过修复各种辅助功能问题,改进了 配置编辑器工具(SvcConfigEditor.exe) 和 服务跟踪查看器工具(SvcTraceViewer.exe)。 其中大多数是小问题,例如未定义名称或某些 UI 自动化模式未正确实现。 虽然许多用户不会意识到这些不正确的值,但使用辅助技术(如屏幕阅读器)的客户会发现这些 SDK 工具更易于访问。
这些增强功能更改了以前的一些行为,例如键盘焦点顺序。
Windows Workflow Foundation (WF) 工作流设计器
工作流设计器中的辅助功能更改包括:
在某些控件中,Tab 键顺序更改为从左到右和从上到下:
用于初始化InitializeCorrelation活动关联数据的关联窗口。
活动的内容定义窗口ReceiveSendSendReplyReceiveReply。
可通过键盘获取更多功能:
编辑活动属性时,当属性组首次被聚焦时,可以通过键盘进行折叠。
可通过键盘访问警告图标。
“属性”窗口中的“更多属性”按钮可通过键盘访问。
键盘用户可以访问工作流设计器的 “参数 ”和“ 变量 ”窗格中的标头项。
改进了具有焦点的项目的可见性,例如:
向工作流设计器和活动设计器使用的数据网格添加行。
在ReceiveReply和SendReply活动中按 Tab 键切换字段。
设置变量或参数的默认值
屏幕阅读器现在可以正确识别:
工作流设计器中设置的断点。
Receive 活动的内容。
活动的目标类型 InvokeMethod 。
活动中的 TryCatch 异常组合框和最终部分。
消息类型组合框、“添加相关初始值设定项”窗口中的拆分器、“内容定义”窗口以及消息活动中的“关联定义”窗口(Receive、Send、SendReply和ReceiveReply)。
状态机转换和转换目标。
活动上的 FlowDecision 注释和连接器。
活动的上下文(右键单击)菜单。
属性值编辑器、“清除搜索”按钮、“按类别”和“按字母顺序排序”按钮,以及属性网格中的“表达式编辑器”对话框。
工作流设计器中的缩放百分比。
活动 InvokeDelegate 。
字典活动的“选择类型”窗口(
Microsoft.Activities.AddToDictionary<TKey,TValue>Microsoft.Activities.RemoveFromDictionary<TKey,TValue>等等)。“浏览并选择 .NET 类型”窗口。
工作流设计器中的痕迹。
选择高对比度主题的用户将在工作流设计器及其控件的可见性方面看到许多改进,例如元素之间的更好的对比度以及用于焦点元素的更明显的选择框。