Partager via


Définir une propriété Automation unique pour les contrôles Silverlight à des fins de test

Si vous souhaitez exécuter des tests codés de l'interface utilisateur ou créer des enregistrements des actions pour votre application Silverlight 4, vous devez disposer d'une propriété Automation unique qui identifie chaque contrôle. Pour plus d'informations sur la configuration de votre application Silverlight pour que les contrôles soient reconnus, consultez Comment : configurer votre application Silverlight à des fins de test.

Vous pouvez assigner une propriété Automation unique selon le type de contrôle Silverlight dans votre application. Cette rubrique explique comment assigner cette propriété Automation unique dans les situations suivantes :

  • Définition XAML statique des contrôles

  • Assigner des propriétés Automation uniques à l'aide d'Expression Blend

  • Utiliser un modèle de données

  • Utiliser un modèle de contrôle

  • Grilles de données

  • Contrôles dynamiques

Méthodes permettant d'assigner une propriété Automation unique

Définition XAML statique

Pour spécifier une propriété Automation unique pour un contrôle défini dans votre fichier XAML, vous pouvez définir la valeur AutomationProperties.AutomationId ou AutomationProperties.Name implicitement ou explicitement, comme indiqué dans les exemples suivants. La définition de l'une ou l'autre de ces valeurs affecte au contrôle une propriété Automation unique qui peut être utilisée pour identifier ce contrôle lorsque vous créez un test codé de l'interface utilisateur ou un enregistrement des actions.

Définir la propriété implicitement

Affectez à AutomationProperties.AutomationId la valeur ButtonX à l'aide de la propriété Nom dans le code XAML pour le contrôle.

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

Affectez à AutomationProperties.Name la valeur ButtonY à l'aide de la propriété Contenu dans le code XAML pour le contrôle.

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

Définir la propriété explicitement

Affectez à AutomationProperties.AutomationId la valeur ButtonX de façon explicite dans le code XAML pour le contrôle.

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

Affectez à AutomationProperties.Name la valeur ButtonY de façon explicite dans le code XAML pour le contrôle.

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

Assigner des propriétés Automation uniques à l'aide d'Expression Blend

Vous pouvez également utiliser Expression Blend 3 ou une version ultérieure pour assigner des noms uniques à des éléments interactifs tels que des boutons, des zones de liste, des zones de liste déroulante et des zones de texte. Cela permet d'affecter au contrôle une valeur unique pour AutomationProperties.Name. Utilisez l'une des méthodes suivantes pour effectuer cela à partir d'Expression Blend.

Notes

Vous ne pouvez utiliser cette méthode que pour les contrôles créés de manière statique à l'aide du code XAML.

Pour affecter un nom unique à des contrôles existants

Dans le menu Outils, cliquez sur Nommer les éléments interactifs, comme le montre l'illustration suivante.

Utiliser Expression Blend pour attribuer des noms uniques.

Pour affecter automatiquement un nom unique aux contrôles que vous créez

Dans le menu Outils, pointez sur Options, puis cliquez sur Projet. Sélectionnez Nommer automatiquement les éléments interactifs lors de leur création, puis cliquez sur OK, comme le montre l'illustration suivante.

Attribuer des noms uniques avec Expression Blend

Utiliser un modèle de données

Vous pouvez définir un modèle simple à l'aide d'un élément ItemTemplate pour lier les valeurs d'une zone de liste à des variables à l'aide du code XAML suivant.

<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>

Vous pouvez également utiliser un modèle avec ItemContainerStyle pour lier les valeurs à des variables à l'aide du code XAML suivant.

      <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>

Pour ces deux exemples, vous devez substituer la méthode ToString() de la méthode ItemSource, comme indiqué dans le code suivant. Ce code vérifie que la valeur pour AutomationProperties.Name est définie et unique, car vous ne pouvez pas définir une propriété Automation unique pour chaque élément de liste lié aux données à l'aide de la liaison. Dans ce cas, la définition d'une valeur unique pour Automation Properties.Name est suffisante.

Notes

Cette approche permet également d'affecter au contenu interne de l'élément de liste une chaîne dans la classe Employee via la liaison. Comme indiqué dans l'exemple, un ID Automation unique (ID d'employé) est assigné au contrôle bouton situé à l'intérieur de chaque élément de la liste.

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
}

Utiliser un modèle de contrôle

Vous pouvez utiliser un modèle de contrôle afin que chaque instance d'un type donné puisse obtenir une propriété Automation unique lorsqu'elle est définie dans le code. Vous devez créer le modèle de sorte qu'une liaison soit établie entre AutomationProperty et un ID unique dans l'instance de contrôle. Le code XAML suivant illustre une approche permettant de créer cette liaison avec un modèle de contrôle.

<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>

Lorsque vous définissez deux instances d'un bouton à l'aide de ce modèle de contrôle, la chaîne de contenu unique est affectée à l'ID Automation pour les contrôles du modèle, comme indiqué dans le code XAML suivant.

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

Grilles de données

Le code XAML suivant illustre un exemple de contrôle de grille de données Silverlight qui est lié aux données.

<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>

Le code suivant montre comment remplir le contenu d'une grille de données à partir d'une source d'élément.

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;

Par défaut, ce code assigne la même valeur pour AutomationProperties.Name à chaque ligne de la grille de données. Il s'agit de la valeur qui est retournée par ToString() pour l'objet PersonalDetails. Pour modifier cette valeur de sorte qu'elle soit unique pour chaque ligne de la grille de données, vous devez substituer la méthode ToString() de la méthode ItemsSource. Par exemple, vous pouvez utiliser le code suivant pour substituer la méthode ToString() de sorte qu'elle retourne une valeur unique qui est ensuite assignée à AutomationProperties.Name.

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

Contrôles dynamiques

Si vous avez des contrôles qui sont créés de façon dynamique à partir de votre code et qui ne sont pas créés de façon statique ni via des modèles dans des fichiers XAML, vous devez définir les propriétés Contenu ou Nom pour ces contrôles. Cela permet de garantir qu'une propriété Automation unique est affectée à chaque contrôle dynamique. Par exemple, si une case à cocher doit être affichée lorsque vous sélectionnez un élément de liste, vous pouvez définir ces propriétés, comme indiqué dans l'exemple de code suivant.

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);
    }

Voir aussi

Autres ressources

Test des applications Silverlight avec des tests codés de l'interface utilisateur ou des enregistrements d'actions