c# - 出于屏幕阅读器的目的覆盖控件的名称

标签 c# wpf accessibility screen-readers

我有一个绑定(bind)到对象集合的 WPF DataGrid 控件。一切都按应有的方式呈现在屏幕上。

ToString() 由于应用程序其他地方的要求已被覆盖。

问题是,当通过屏幕阅读器(如 Microsoft 的内置讲述人)阅读时,或通过 AccChecker/Inspect 等工具检查时,控件的 name 是被覆盖的 ToString 值。

我希望能够为屏幕阅读器指定一个描述性名称,但找不到这样做的方法。我已经尝试设置 AutomationProperties.NameAutomationProperties.ItemType 等等,但是 AutomationProperties 中的所有属性似乎都没有所需的效果。

最理想的情况是,我能够对数据项本身以及列的各个成员执行此操作。

这是我遇到的问题的完整演示:

<DataGrid x:Name="dgTest" ItemsSource="{Binding}" AutoGenerateColumns="false" AutomationProperties.Name="Test">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Name" IsReadOnly="True" Width="2*" AutomationProperties.Name="Test2">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Path=Name}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="ID" IsReadOnly="True" Width="2*">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Path=Id}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

还有代码:

public class FooItem
{
    public Guid Id { get; set; }
    public string Name { get; set; }

    public override string ToString()
    {
        return string.Concat(Id.ToString(), " : ", Name);
    }
}

public partial class MainWindow : Window
{
    public readonly List<FooItem> fooList = new List<FooItem>();
    public MainWindow()
    {
        fooList.Add(new FooItem { Id = Guid.NewGuid(), Name = "Test 1" });
        fooList.Add(new FooItem { Id = Guid.NewGuid(), Name = "Test 2" });
        fooList.Add(new FooItem { Id = Guid.NewGuid(), Name = "Test 3" });

        InitializeComponent();
        dgTest.DataContext = fooList;
    }
}

为了完整起见,这里是 Inspector 的屏幕截图。 full size image Inspector screenshot

最佳答案

我找到了解决方案...我必须在 DataGrid.ItemContainerStyleDataGridTemplateColumn.HeaderStyle 上使用样式来设置 AutomationProperties.Name .

例如:

<DataGrid x:Name="dgTest" ItemsSource="{Binding}" AutoGenerateColumns="false" AutomationProperties.Name="Test"> 
    <DataGrid.ItemContainerStyle>
         <Style>
              <Setter Property="AutomationProperties.Name" Value="Row Item" />
         </Style>
    </DataGrid.ItemContainerStyle>
    <DataGrid.Columns> 
        <DataGridTemplateColumn Header="Name" IsReadOnly="True" Width="2*" AutomationProperties.Name="Test2"> 
            <DataGridTemplateColumn.CellTemplate> 
                <DataTemplate> 
                    <TextBlock Text="{Binding Path=Name}"/> 
                </DataTemplate> 
            </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 
            <DataGridTemplateColumn Header="ID" IsReadOnly="True" Width="2*"> 
            <DataGridTemplateColumn.CellTemplate> 
                <DataTemplate> 
                    <TextBlock Text="{Binding Path=Id}"/> 
                </DataTemplate> 
            </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid>

关于c# - 出于屏幕阅读器的目的覆盖控件的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9086158/

相关文章:

c# - Application_AcquireRequestState 未执行

c# - 在 asp.net 中使用文本框拆分单词

wpf - WPF 列和行定义是否有任何简写?

html - 跳过整个网站标题顶部的链接

c# - 我应该在哪个级别应用依赖注入(inject)? Controller 还是域?

c# - Storyboard DoubleAnimation 不适用于 StackPanel 高度属性

c# - 当 MVVM 中的 CaretIndex 更改时我没有收到通知

C# 如何将 Int ddmmyy 转换为 DateTime?

android - 多个在辅助功能服务的帮助下绘制 View 的应用程序无法同时工作

css - 使用 CSS 添加控件到 HTML5 背景视频