Переопределение имени элемента управления для целей чтения с экрана - PullRequest
3 голосов
/ 01 февраля 2012

У меня есть элемент управления WPF DataGrid, который привязан к коллекции объектов. Все отображается на экране, как и должно быть.

ToString() было переопределено из-за требований в другом месте приложения.

Проблема заключается в том, что при чтении с помощью программы чтения с экрана (например, встроенного в Microsoft Narrator) или при проверке с помощью такого инструмента, как AccChecker / Inspect, name элемента управления является переопределенным значением ToString.

Я хочу указать описательное имя для программы чтения с экрана, но не могу найти способ сделать это. Я пытался установить AutomationProperties.Name, AutomationProperties.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. полноразмерное изображение Inspector screenshot

1 Ответ

3 голосов
/ 05 февраля 2012

Я нашел решение ... Мне пришлось использовать стиль на DataGrid.ItemContainerStyle и DataGridTemplateColumn.HeaderStyle, чтобы установить AutomationProperties.Name.

Ex:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...