You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Windows桌面应用DataGrid的无障碍焦点元素Name属性为空问题

修复DataGrid可焦点元素Name属性为空的无障碍问题

首次处理Windows无障碍相关问题时,使用Accessibility Insights for Windows工具检测桌面应用,发现DataGrid的自定义列及其他列中可焦点元素的Name属性为空。

问题代码

<controls:DataGrid
    x:Uid="DataTable"
    x:Name="detailGrid"
    Margin="0"
    VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
    HorizontalScrollBarVisibility="Visible"
    VerticalScrollBarVisibility="Visible"
    AreRowDetailsFrozen="False"
    AreRowGroupHeadersFrozen="True"
    AutoGenerateColumns="False"
    CanUserSortColumns="True"
    CanUserReorderColumns="True"
    CanUserResizeColumns="True"
    ColumnHeaderHeight="28"
    MaxColumnWidth="500"
    FrozenColumnCount="0"
    GridLinesVisibility="None"
    HeadersVisibility="Column"
    IsReadOnly="False"     
    RowDetailsVisibilityMode="Collapsed"
    SelectionMode="Extended"
    SelectionChanged="OnDataGridSelectionChanged"
    RowHeight="25"
    RowGroupHeaderPropertyNameAlternative="Range"
    ItemsSource="{x:Bind ViewModel.GridData}" Visibility="{x:Bind ViewModel.IsContentVisible, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}">
    <controls:DataGrid.Columns>
        <controls:DataGridTemplateColumn Header="Name">
            <controls:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Image Margin="10,0,0,0" Width="15" Source="../Assets/folder.png" Visibility="{Binding ChildFolder.IsFolder, Converter={StaticResource BoolToVisibilityConverter}}" />
                        <Image Margin="10,0,0,0" Width="15" Source="../Assets/file.png" Visibility="{Binding ChildFolder.IsFolder, Converter={StaticResource BoolToInverseVisibilityConverter}}" />
                        <HyperlinkButton Height="28" FontFamily="Segoe" Content="{Binding ChildFolder.FolderName}" Margin="0" FontSize="12px" Tapped="onSingleTapped" DoubleTapped="onDoubleTapped" IsDoubleTapEnabled="True" CommandParameter="{Binding ChildFolder}" HorizontalAlignment="Stretch">
                        </HyperlinkButton>
                    </StackPanel>
                </DataTemplate>
            </controls:DataGridTemplateColumn.CellTemplate>
        </controls:DataGridTemplateColumn>
        <!--<controls:DataGridTextColumn Binding="{Binding ChildFolder.BlobType}" Header="Blob Type" />-->
        <controls:DataGridTextColumn Binding="{Binding ChildFolder.LastModifiedLocal}" Header="Last Modified" />
        <controls:DataGridTextColumn Binding="{Binding ChildFolder.ContentTypeDisplay}" Header="Content Type" />
        <controls:DataGridTextColumn Binding="{Binding ChildFolder.ContentSize}" Header="Size" />
        <controls:DataGridTextColumn Binding="{Binding ChildFolder.LeaseStateString}" Header="Lease State" />

    </controls:DataGrid.Columns>
</controls:DataGrid>

问题截图

问题截图

已查阅微软官方关于UWP XAML自定义控件本地化控件类型、自定义控件名称的无障碍文档,但仍不清楚修复方法,现提供解决方案如下:


解决方案

1. 自定义模板列(DataGridTemplateColumn)修复

自定义列中的HyperlinkButton是可焦点元素,需为其设置AutomationProperties.Name,值需明确包含列标识与内容,让屏幕阅读器能清晰识别元素含义:

<HyperlinkButton 
    Height="28" 
    FontFamily="Segoe" 
    Content="{Binding ChildFolder.FolderName}" 
    Margin="0" 
    FontSize="12px" 
    Tapped="onSingleTapped" 
    DoubleTapped="onDoubleTapped" 
    IsDoubleTapEnabled="True" 
    CommandParameter="{Binding ChildFolder}" 
    HorizontalAlignment="Stretch"
    <!-- 添加无障碍名称绑定 -->
    AutomationProperties.Name="{Binding StringFormat='Name: {0}', Path=ChildFolder.FolderName}">
</HyperlinkButton>

同时,列中的图片属于非交互辅助元素,可设置IsTabStop="False"避免被焦点选中:

<Image 
    Margin="10,0,0,0" 
    Width="15" 
    Source="../Assets/folder.png" 
    Visibility="{Binding ChildFolder.IsFolder, Converter={StaticResource BoolToVisibilityConverter}}"
    IsTabStop="False" />

2. 文本列(DataGridTextColumn)修复

对于DataGridTextColumn,需通过CellStyle为单元格内的可焦点元素统一设置无障碍名称,绑定列头与单元格内容:

<controls:DataGridTextColumn 
    Binding="{Binding ChildFolder.LastModifiedLocal}" 
    Header="Last Modified">
    <controls:DataGridTextColumn.CellStyle>
        <Style TargetType="controls:DataGridCell">
            <Setter Property="AutomationProperties.Name" 
                    Value="{Binding StringFormat='Last Modified: {0}', Path=ChildFolder.LastModifiedLocal}" />
        </Style>
    </controls:DataGridTextColumn.CellStyle>
</controls:DataGridTextColumn>

其他文本列(如Content Type、Size等)可参照此方式修改,确保每个可焦点单元格都有明确的无障碍名称。

3. 通用修复要点

  • 所有可交互/可焦点元素(如按钮、可编辑输入框)必须设置AutomationProperties.Name,值应清晰描述元素的功能或内容。
  • 非交互元素需设置IsTabStop="False",避免干扰键盘导航与屏幕阅读器识别。
  • 无障碍名称的命名需遵循用户认知习惯,优先采用「列名: 内容」的格式,帮助用户快速定位当前单元格的含义。

内容的提问来源于stack exchange,提问作者Apoorva Petkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:55:35