Программа чтения с экрана WPF Groupstyles

Я пытаюсь установить свойство AutomationProperties.Name для элементов управления в шаблоне элемента управления GroupStyle, но, похоже, ничего не дает. У меня он установлен на Expander в моем шаблоне, но он ничего не говорит, даже когда я просто вставляю какой-то текст без привязки. Я также пробовал установить сеттер на GroupItem, но это тоже не сработало. Я немного растерялся. Я надеялся, что свойство элемента группы решит эту проблему.

XAML:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Class="WpfApplication8.MainWindow"
        x:Name="win"
        Title="MainWindow"
        Width="640"
        Height="480">

  <Grid x:Name="LayoutRoot">
    <ListBox x:Name="lstbx"
             Margin="71,45,99,78"
             ItemsSource="{Binding ElementName=win,
                                       Path=Samples}">
      <ListBox.GroupStyle>
        <GroupStyle>
          <GroupStyle.ContainerStyle>
            <Style TargetType="{x:Type GroupItem}">
              <Setter Property="AutomationProperties.Name"
                      Value="this is a test" />
              <Setter Property="KeyboardNavigation.TabNavigation"
                      Value="Cycle" />
              <Setter Property="Template">
                <Setter.Value>
                  <ControlTemplate TargetType="{x:Type GroupItem}">
                    <Expander Name="templateLstBxExpander"
                              AutomationProperties.Name="test test test"
                              IsExpanded="True">

                      <Expander.Header>
                        <StackPanel Orientation="Horizontal">
                          <Label Name="templateLstBxExpanderHeader"
                                 Content="{Binding Path=Name}"
                                 FontWeight="Bold" />
                        </StackPanel>
                      </Expander.Header>
                      <ItemsPresenter />
                    </Expander>
                  </ControlTemplate>
                </Setter.Value>
              </Setter>
            </Style>
          </GroupStyle.ContainerStyle>
        </GroupStyle>
      </ListBox.GroupStyle>
    </ListBox>
  </Grid>
</Window>

XAML.cs:

using System;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace WpfApplication8
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public static readonly DependencyProperty sampleProperty = DependencyProperty.Register(
        "Samples", typeof(ObservableCollection<sample>), typeof(MainWindow), new PropertyMetadata(new ObservableCollection<sample>()));

    public ObservableCollection<sample> Samples
    {
        get
        {
            return (ObservableCollection<sample>)this.GetValue(sampleProperty);
        }

        set
        {
            this.SetValue(sampleProperty, value);
        }
    }      

    public MainWindow()
    {
        this.InitializeComponent();

         CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lstbx.ItemsSource);
        PropertyGroupDescription groupDescription = new PropertyGroupDescription("Location");
        view.GroupDescriptions.Add(groupDescription);      
        sample test = new sample();
        test.Location = "one";
        test.Name = "blah blah";
        Samples.Add(test);
        sample test2 = new sample();
        test2.Location = "two";
        test2.Name = "ya ya";
        Samples.Add(test2);

    }
}
}

sample.cs:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace WpfApplication8
{
public class sample
{


    public string Name { set; get; }
    public string Location{ set; get; }

}

person user892381    schedule 11.10.2013    source источник
comment
Есть мысли по этому поводу?   -  person user892381    schedule 14.10.2013
comment
Я проверил этот пример с VS 2015, и свойства AutomationProperties были установлены правильно - я проверил их с помощью WPF Snoop. Я думаю, что проблема не в AutomationProperties, а в программном обеспечении, используемом для их проверки. Некоторые инструменты, предоставленные и рекомендованные Microsoft, не читают их должным образом (я не помню названия) - моей команде пришлось столкнуться с такой проблемой несколько месяцев назад.   -  person Maciek Świszczowski    schedule 03.02.2016
comment
AutomationProperties class: Предоставляет средства получения или установки значения связанных свойств экземпляра AutomationPeer элемента. Это не для стандартных элементов управления WPF. Для ListBox есть ListBoxAutomationPeer класс.   -  person AnjumSKhan    schedule 04.02.2016
comment
На самом деле это зависит от того, какую программу чтения с экрана вы используете, люди продолжают говорить, что родная программа в Windows (экранный диктор, который, скорее всего, вы используете) очень ограничена по сравнению с другими проприетарными программами чтения с экрана, что может быть источником проблемы.   -  person SamTh3D3v    schedule 04.02.2016
comment
Я не тестировал, но попробую спеть <StackPanel IsItemHost="True" /> вместо `‹ ItemsPresenter / ›`, у меня была проблема с диктором Windows, очевидно, он не читает материал в ItemsPresenter, по какой-то причине мне потребовалось несколько дней, чтобы понять это.   -  person IronHide    schedule 19.11.2019


Ответы (3)


Проблема на самом деле в том, как программа чтения с экрана должна достичь нужного значения. Групповые элементы доступны из курсора через MSAA, но не через UIA. UIA - это основной API, используемый для обеспечения доступности в WPF.

Основная проблема с UIA и WPF заключается в том, что при попытке чтения элементов управления, обнаруженных курсором (другие способы - фокус и курсор), обычно вместо этого возвращается главное окно.

Как разработчик программы чтения с экрана, лучший способ справиться с этим - использовать как MSAA, так и UIA. Если UIA не возвращает ничего ценного, вернитесь к использованию MSAA.

person Robin    schedule 01.05.2018

Попробуйте установить AutomationProperties.HelpText вместе с Name.

person filhit    schedule 13.05.2016

Вы можете использовать DisplayMemberPath="Name":

    <ListBox x:Name="lstbx" Margin="71,45,99,78" ItemsSource="{Binding ElementName=win, Path=Samples}" DisplayMemberPath="Name" >

введите здесь описание изображения

Или вы можете использовать .ToString():

public class sample
{
    public string Name { set; get; }

    public string Location { set; get; }

    public override string ToString()
    {
        return Name;
    }
}
person IUB    schedule 04.02.2016