Wpf 在GridViewRowPresenter(ListView)中将自动ID分配给ContentPresenter

Wpf 在GridViewRowPresenter(ListView)中将自动ID分配给ContentPresenter,wpf,ui-automation,coded-ui-tests,Wpf,Ui Automation,Coded Ui Tests,我正在尝试使用一个列表视图进行编码UI测试,该列表视图有一个复选框项目列表 由于编码的UI代码无法选择复选框单元格,我一直在尝试将AutomationId添加到控件中,以便编码的UI测试能够工作 我就快到了,在snoop中我可以看到UIItemCell没有设置AutomationId,但我不知道如何在我的应用程序中设置它 UIItemCell是我需要设置AutomationId的地方 我和史努普一起发现是内容演示者 ListView代码非常复杂,因此我将对其进行一些提取 <ListVi

我正在尝试使用一个列表视图进行编码UI测试,该列表视图有一个复选框项目列表

由于编码的UI代码无法选择复选框单元格,我一直在尝试将AutomationId添加到控件中,以便编码的UI测试能够工作

我就快到了,在snoop中我可以看到UIItemCell没有设置AutomationId,但我不知道如何在我的应用程序中设置它

UIItemCell是我需要设置AutomationId的地方

我和史努普一起发现是内容演示者

ListView代码非常复杂,因此我将对其进行一些提取

<ListView HorizontalAlignment="Left"
          Height="194"
          Margin="53,123,0,0"
          VerticalAlignment="Top"
          Width="424"
          AutomationProperties.AutomationId="listviewoption">
    <ListView.Resources>
        <Style x:Key="ListViewItemContainerStyle1" TargetType="{x:Type ListViewItem}">
            <Setter Property="ToolTip"
                    Value="{Binding RelativeSource={RelativeSource Self}, Path=Content.Description }" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListViewItem}">

                        <Border SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                BorderThickness="{TemplateBinding BorderThickness}"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                Background="{TemplateBinding Background}"
                                AutomationProperties.AutomationId="Bxaid1" >

                            <Grid AutomationProperties.AutomationId="Gxaid1">

                                <!-- This is used when GridView is put inside the ListView -->
                                <GridViewRowPresenter AutomationProperties.AutomationId="gvrp"
                                                      Content="{TemplateBinding Content}"
                                                      HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                                      VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                                      SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                                <!-- ... -->
                            </Grid>

                        </Border>

                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ListView.Resources>

    <ListView.ItemContainerStyle>
        <StaticResource ResourceKey="ListViewItemContainerStyle1"/>
    </ListView.ItemContainerStyle>

    <ListView.View>

        <GridView AutomationProperties.AutomationId="aid1">

            <GridViewColumn AutomationProperties.AutomationId="xc0"
                            DisplayMemberBinding="{Binding OptionName, Converter={StaticResource CamelCaseConverter}, Mode=OneWay}"
                            Width="180"/>

            <GridViewColumn AutomationProperties.AutomationId="xc1"
                            Width="60">

                <GridViewRowPresenter AutomationProperties.AutomationId="pp" />

                <GridViewColumn.CellTemplate>
                    <DataTemplate  >
                        <CheckBox Name="x1"
                                  AutomationProperties.AutomationId="xaid1"
                                  IsHitTestVisible="False"
                                  HorizontalAlignment="Right"
                                  Tag="{Binding OptionName}"
                                  IsChecked=""
                                  Padding="0"
                                  Margin="0"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>

            </GridViewColumn>
        </GridView>

    </ListView.View>
</ListView>

有一些自动ID没有帮助,但它们是很好的参考点;'gvrp'是GridViewRowPresenter[016],它保存了我想要设置id的内容演示器[017],而'xaid1'是内容演示器[017]内的复选框


请在我的头爆炸之前帮我一下。

我终于可以用

<GridViewRowPresenter Content="{TemplateBinding Content}"
                      HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                      VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                      SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}">

    <GridViewRowPresenter.Resources>
        <Style TargetType="{x:Type ContentPresenter}">
            <Setter Property="AutomationProperties.AutomationId"
                    Value="{Binding RelativeSource={RelativeSource Self}, Path=Content.Name }"/>
        </Style>
    </GridViewRowPresenter.Resources>

</GridViewRowPresenter>

然而,自动测试生成的代码(编码的UI)仍然引用了表列(尽管它是冗余的),这是我一开始试图避免的问题

无论如何,可以在
ContentPresenter
中设置
AutomationId
,以防它对未来的任何人都有帮助,这里就是