Share via


为 Silverlight 控件设置唯一的自动化属性以进行测试

若要运行编码的 UI 测试或为 Silverlight 4 应用程序创建操作录制,您必须用一个唯一的自动化属性标识各个控件。 有关如何设置 Silverlight 应用程序以便识别控件的更多信息,请参见如何:设置 Silverlight 应用程序以进行测试

可基于应用程序中的 Silverlight 控件的类型分配一个唯一的自动化属性。 本主题说明了如何在以下情况下分配此唯一的自动化属性:

  • 控件的静态 XAML 定义

  • 使用 Expression Blend 分配唯一的自动化属性

  • 使用 DataTemplate

  • 使用控件模板

  • 数据网格

  • 动态控件

用于分配唯一的自动化属性的方法

静态 XAML 定义

若要为 XAML 文件中定义的控件指定一个唯一的自动化属性,您可隐式或显式设置 AutomationProperties.AutomationId 或 AutomationProperties.Name,如以下示例所示。 通过设置上述任一值,可为控件分配一个唯一的自动化属性,当您创建编码的 UI 测试或操作录制时,可使用该属性标识控件。

隐式设置属性

在控件的 XAML 中,使用 Name 属性将 AutomationProperties.AutomationId 设置为 ButtonX。

<Button Name="ButtonX" Height="31" HorizontalAlignment="Left" Margin="23,26,0,0"  VerticalAlignment="Top" Width="140" Click="ButtonX_Click" />

在控件的 XAML 中,使用 Content 属性将 AutomationProperties.Name 设置为 ButtonY。

<Button Content="ButtonY" Height="31" HorizontalAlignment="Left" Margin="23,76,0,0" VerticalAlignment="Top" Width="140" Click="ButtonY_Click" />

显式设置属性

在控件的 XAML 中,将 AutomationProperties.AutomationId 显式设置为 ButtonX。

<Button AutomationProperties.AutomationId=“ButtonX” Height="31" HorizontalAlignment="Left" Margin="23,26,0,0"  VerticalAlignment="Top" Width="140" Click="ButtonX_Click" />

在控件的 XAML 中,将 AutomationProperties.Name 显式设置为 ButtonY。

<Button AutomationProperties.Name="ButtonY" Height="31" HorizontalAlignment="Left" Margin="23,76,0,0" VerticalAlignment="Top" Width="140" Click="ButtonY_Click" />

使用 Expression Blend 分配唯一的自动化属性

还可使用 Expression Blend 3 或更高版本为交互元素(例如,按钮、列表框、组合框和文本框)分配唯一名称。 这将为控件的 AutomationProperties.Name 分配一个唯一值。 通过使用下列方法之一,可在 Expression Blend 中执行此操作。

提示

您只能将此方法用于通过使用 XAML 静态创建的控件。

为现有控件提供一个唯一名称

在**“工具”菜单上,单击“命名交互元素”**,如下图所示。

使用 Expression Blend 分配唯一名称

自动为创建的控件提供一个唯一名称

在**“工具”菜单上,指向“选项”,然后单击“项目”。 选择“在创建时自动命名交互元素”,然后单击“确定”**,如下图所示。

使用 Expression Blend 分配唯一名称

使用数据模板

可以使用 ItemTemplate 定义一个简单模板,以使用以下 XAML 将列表框中的值绑定到变量。

<ListBox Name="listBox1 ItemsSource="{Binding Source={StaticResource employees}}">
   <ListBox.ItemTemplate>
      <DataTemplate>
         <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding EmployeeName}" />
            <TextBlock Text="{Binding EmployeeID}" />
         </StackPanel>
      </DataTemplate>
   </ListBox.ItemTemplate>
</ListBox>

还可以将模板与 ItemContainerStyle 一起使用,以使用以下 XAML 将值绑定到变量。

      <ListBox Name="listBox1 ItemsSource="{Binding Source={StaticResource employees}}">
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="ListBoxItem">
                                <Grid>
                                    <Button Content="{Binding EmployeeName}" AutomationProperties.AutomationId="{Binding EmployeeID}"/>
                                </Grid>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListBox.ItemContainerStyle>         
        </ListBox>

对于这两个示例,您必须重写 ItemSource 的 ToString() 方法,如使用以下代码的情况所示。 此代码可确保设置 AutomationProperties.Name 值且该值是唯一的,因为您无法使用绑定为每个数据绑定列表项设置一个唯一的自动化属性。 在此示例中,为 Automation Properties.Name 设置一个唯一值即可。

提示

通过使用此方法,还可通过绑定将列表项的内部内容设置为 Employee 类中的字符串。 如示例中所示,为每个列表项内的按钮控件分配一个唯一的自动化 ID(即 Employee ID)。

Employee[] employees = new Employee[] 
{
   new Employee("john", "4384"),
   new Employee("margaret", "7556"),
   new Employee("richard", "8688"),
   new Employee("george", "1293")
};

listBox1.ItemsSource = employees;

public override string ToString()
{
    return EmployeeName + EmployeeID; // Unique Identification to be set as the AutomationProperties.Name
}

使用控件模板

通过使用控件模板,可使得在代码中定义某个特定类型的每个实例时,这些实例都获得一个唯一的自动化属性。 您必须创建模板,以便 AutomationProperty 在控件实例中绑定到一个唯一的 ID。 以下 XAML 演示了使用控件模板创建此绑定的一种方法。

<Style x:Key="MyButton" TargetType="Button">
<Setter Property="Template">
   <Setter.Value>
<ControlTemplate TargetType="Button">
   <Grid>
      <CheckBox HorizontalAlignment="Left" AutomationProperties.AutomationId="{TemplateBinding Content}"></CheckBox>
      <Button Width="90" HorizontalAlignment="Right" Content="{TemplateBinding Content}" AutomationProperties.AutomationId="{TemplateBinding Content}"></Button>
   </Grid>
</ControlTemplate>
   </Setter.Value>
</Setter>
</Style>

在使用此控件模板定义按钮的两个实例时,自动化 ID 在模板中将设置为控件的唯一内容字符串,如以下 XAML 所示。

<Button Content=”Button1” Style="{StaticResource MyButton}" Width="140"/>
<Button Content=”Button2” Style="{StaticResource MyButton}" Width="140"/>

数据网格

下面的 XAML 提供了一个将绑定到数据的 Silverlight 数据网格控件的示例。

<Grid >
<data:DataGrid Name="Details" Margin="5" HeadersVisibility="All" AutoGenerateColumns="False" >
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="Name"
Binding="{Binding name}" />
<data:DataGridTextColumn Header="Age"
Binding="{Binding age}" />
<data:DataGridTextColumn Header="Education"
Binding="{Binding education}" />

</data:DataGrid.Columns>
</data:DataGrid>
</Grid>

下面的代码演示如何从项目资源填充数据网格内容。

List<PersonalDetails> persons = new List<PersonalDetails>();
String[] Education = { "High School", "Graduate", "Post Graduate" };
for (int i=0; i<10; i++)
   {
      persons.Add(new PersonalDetails()
      {
          name = "name" + i,
          education = Education[i%3],
          age = 20 + i + i/2 + i*2
      });
   }
Details.ItemsSource = persons;

默认情况下,此代码会将同一个 AutomationProperties.Name 值分配给数据网格中的各个行。 此值是 ToString() 为 PersonalDetails 对象返回的值。 若要更改此值,使其对数据网格中的每个行都是唯一的,您必须重写 ItemsSource 方法的 ToString() 方法。 例如,可以使用以下代码来重写 ToString() 方法,使其返回一个稍后将分配给 AutomationProperties.Name 的唯一值。

public override string ToString()
   {
       return name.ToString() + age.ToString();
   }

动态控件

如果您具有的控件是从您的代码中动态创建的,而不是静态创建的或通过 XAML 文件中的模板创建的,则您必须设置控件的 Content 属性或 Name 属性。 这将确保每个动态控件都具有一个唯一的自动化属性。 例如,如果您的复选框必须在选择列表项时显示,则可设置这些属性,如以下代码示例中所示。

private void CreateCheckBox(string txt, StackPanel panel)
   {
      CheckBox cb = new CheckBox();
      cb.Content = txt; // Sets the AutomationProperties.Name
      cb.Height = 50;
      cb.Width = 100;
      cb.Name = "DynamicCheckBoxAid"+ txt; // Sets the AutomationProperties.AutomationId
      panel.Children.Add(cb);
    }

请参见

其他资源

使用编码的 UI 测试或操作录制来测试 Silverlight 应用程序