如何在 GridViewHeaderItem 上设置 AutomationProperties.Name?
How Can I Set AutomationProperties.Name on a GridViewHeaderItem?
我的应用程序中有一个 Grouped GridView。我想在 GridViewHeaderItem
对象上设置 AutomationProperties.Name
,我可以使用 <Style>
来实现,如下所示:
<Style x:Key="GridViewHeaderStyle" TargetType="GridViewHeaderItem">
<Setter Property="AutomationProperties.Name" Value="This Works" />
</Style>
以下 不 工作,无论我绑定到什么:
<Style x:Key="GridViewHeaderStyle" TargetType="GridViewHeaderItem">
<Setter Property="AutomationProperties.Name" Value="{Binding DataContext.PropertyDoesNotWork}" />
</Style>
如何将 AutomationProperties.Name
设置为 运行 时间?创建 GridViewHeaderItem
对象时是否会触发某些事件?
谢谢。
不在 Style 中指定名称,而是定义 GridView.GroupStyle 的 HeaderTemplate 并在那里使用数据绑定
<Grid AutomationProperties.Name="{Binding MyNameProperty}">
...
</Grid>
解决方案:AutomationPeers
下面是我如何能够在运行时在 GridViewHeaderItem 上设置 AutomationProperties.Name,而无需使用 VisualTreeHelper。基本上,我使用 AutomationPeer 类 获取对 GridViewHeaderItem 的引用,然后以这种方式设置 AutomationProperties.Name。
Control.xaml
<GridView ...>
<GridView.GroupStyle>
<GroupStyle ...>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<!-- Important to handle the Loaded event -->
<TextBlock Loaded="TextBlockLoaded" Text="Hi" />
</DateTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</GridView.GroupStyle>
</GridView>
Control.xaml.cs
private void TextBlockLoaded(object sender, RoutedEventArgs e)
{
var textBlockAP = FrameworkElementAutomationPeer.CreatePeerForElement(sender as UIElement);
if (textBlockAP != null)
{
var parentAP = textBlockAP.Navigate(AutomationNavigationDirection.Parent);
if (parentAP is GridViewHeaderItemAutomationPeer gridViewHeaderItemAP)
{
var gridViewHeaderItem = gridViewHeaderItemAP.Owner as GridViewHeaderItem;
var itemGroup = gridViewHeaderItem.Content as SomeItemGroupClass;
AutomationProperties.SetName(gridViewHeaderItem, itemGroup.Title ?? string.Empty);
}
}
}
这对我非常具体的用例来说非常有效。
我的应用程序中有一个 Grouped GridView。我想在 GridViewHeaderItem
对象上设置 AutomationProperties.Name
,我可以使用 <Style>
来实现,如下所示:
<Style x:Key="GridViewHeaderStyle" TargetType="GridViewHeaderItem">
<Setter Property="AutomationProperties.Name" Value="This Works" />
</Style>
以下 不 工作,无论我绑定到什么:
<Style x:Key="GridViewHeaderStyle" TargetType="GridViewHeaderItem">
<Setter Property="AutomationProperties.Name" Value="{Binding DataContext.PropertyDoesNotWork}" />
</Style>
如何将 AutomationProperties.Name
设置为 运行 时间?创建 GridViewHeaderItem
对象时是否会触发某些事件?
谢谢。
不在 Style 中指定名称,而是定义 GridView.GroupStyle 的 HeaderTemplate 并在那里使用数据绑定
<Grid AutomationProperties.Name="{Binding MyNameProperty}">
...
</Grid>
解决方案:AutomationPeers
下面是我如何能够在运行时在 GridViewHeaderItem 上设置 AutomationProperties.Name,而无需使用 VisualTreeHelper。基本上,我使用 AutomationPeer 类 获取对 GridViewHeaderItem 的引用,然后以这种方式设置 AutomationProperties.Name。
Control.xaml
<GridView ...>
<GridView.GroupStyle>
<GroupStyle ...>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<!-- Important to handle the Loaded event -->
<TextBlock Loaded="TextBlockLoaded" Text="Hi" />
</DateTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</GridView.GroupStyle>
</GridView>
Control.xaml.cs
private void TextBlockLoaded(object sender, RoutedEventArgs e)
{
var textBlockAP = FrameworkElementAutomationPeer.CreatePeerForElement(sender as UIElement);
if (textBlockAP != null)
{
var parentAP = textBlockAP.Navigate(AutomationNavigationDirection.Parent);
if (parentAP is GridViewHeaderItemAutomationPeer gridViewHeaderItemAP)
{
var gridViewHeaderItem = gridViewHeaderItemAP.Owner as GridViewHeaderItem;
var itemGroup = gridViewHeaderItem.Content as SomeItemGroupClass;
AutomationProperties.SetName(gridViewHeaderItem, itemGroup.Title ?? string.Empty);
}
}
}
这对我非常具体的用例来说非常有效。