【发布时间】:2013-10-20 00:05:54
【问题描述】:
我正在尝试为GroupStyle 控件模板中的控件设置AutomationProperties.Name 属性,但它似乎什么也没产生。我在模板中的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);
}
}
}
示例.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; }
}
【问题讨论】:
-
对这个有什么想法吗?
-
我已经使用 VS 2015 检查了这个示例,并且 AutomationProperties 设置正确 - 我已经使用 WPF Snoop 检查了它们。我认为问题不在于 AutomationProperties,而在于用于检查它们的软件。 Microsoft 提供和推荐的一些工具无法正确阅读(我不记得名称) - 我的团队几个月前不得不处理这样的问题。
-
AutomationProperties类:提供一种获取或设置AutomationPeer元素实例的关联属性值的方法。它不适用于标准 WPF 控件。对于ListBox,有ListBoxAutomationPeer类。 -
这实际上取决于您使用的屏幕阅读器,人们一直说与其他专有屏幕阅读器相比,Windows 中的原生屏幕阅读器(讲述人,您很可能正在使用)非常有限,这可能是问题的根源
-
我还没有测试过,但尝试唱
<StackPanel IsItemHost="True" />而不是`` 我遇到了Windows narrator 的问题,显然它由于某种原因没有读取ItemsPresenter 中的内容,我花了几天时间才弄清楚这出来了。
标签: c# wpf automation screen-readers