Definir uma propriedade de automação exclusiva para controles do Silverlight para teste
Se você deseja executar testes codificados da interface do usuário ou criar gravações de ação para o seu aplicativo do Silverlight 4, você deve ter uma propriedade de automação exclusiva que identifica cada controle. Para obter mais informações sobre como configurar seu aplicativo do Silverlight, para que os controles são reconhecidos, consulte Como: Configurar seu aplicativo do Silverlight para teste.
Você pode atribuir uma propriedade exclusiva de automação com base no tipo de controle do Silverlight em seu aplicativo. Este tópico aborda como atribuir essa propriedade exclusiva de automação nas seguintes situações:
Definição de XAML estática de controles
Atribuir propriedades exclusivas de automação, usando o Expression Blend
Usar um DataTemplate
Usar um modelo de controle
Grades de dados
Controles dinâmicos
Métodos a serem usados para atribuir uma propriedade exclusiva de automação
Definição de XAML estática
Para especificar uma propriedade de automação exclusiva para um controle que é definido no arquivo XAML, você pode definir o AutomationProperties.AutomationId ou AutomationProperties.Name implicitamente ou explicitamente, conforme mostrado nos exemplos a seguir. A definição de qualquer um desses valores dá ao controle uma propriedade exclusiva de automação que pode ser usada para identificar o controle quando você criar uma gravação codificada de ação ou de teste da interface do usuário.
Defina a propriedade implicitamente
Defina a AutomationProperties.AutomationId ButtonX usando a propriedade Name no XAML para o controle.
<Button Name="ButtonX" Height="31" HorizontalAlignment="Left" Margin="23,26,0,0" VerticalAlignment="Top" Width="140" Click="ButtonX_Click" />
Defina a AutomationProperties.Name ButtonY usando a propriedade Content no XAML para o controle.
<Button Content="ButtonY" Height="31" HorizontalAlignment="Left" Margin="23,76,0,0" VerticalAlignment="Top" Width="140" Click="ButtonY_Click" />
Defina a propriedade explicitamente
Defina a AutomationProperties.AutomationId ButtonX explicitamente no XAML para o controle.
<Button AutomationProperties.AutomationId=“ButtonX” Height="31" HorizontalAlignment="Left" Margin="23,26,0,0" VerticalAlignment="Top" Width="140" Click="ButtonX_Click" />
Defina a AutomationProperties.Name ButtonY explicitamente no XAML para o controle.
<Button AutomationProperties.Name="ButtonY" Height="31" HorizontalAlignment="Left" Margin="23,76,0,0" VerticalAlignment="Top" Width="140" Click="ButtonY_Click" />
Atribuir propriedades exclusivas de automação, usando o Expression Blend
Você também pode usar o Expression Blend 3 ou posterior atribuir nomes exclusivos para elementos interativos, como botões, caixas de listagem, caixas de combinação e texto, caixas. Isso dá ao controle um valor exclusivo para AutomationProperties.Name. Use um dos seguintes métodos para fazer isso no Expression Blend.
![]() |
---|
Você só pode usar esse método para controles que são criados usando o XAML estaticamente. |
Para dar um nome exclusivo para controles existentes
Sobre o Ferramentas menu, clique em Elementos interativos de nome, conforme mostrado na ilustração a seguir.
Para automaticamente, dê um nome exclusivo para controles que você cria.
Sobre o Ferramentas , aponte para Opçõese em seguida, clique em projeto. Selecione automaticamente elementos interativos na criação de nome e, em seguida, clique em OK, conforme mostrado na ilustração a seguir.
Usar um modelo de dados
Você pode definir um modelo simples usando o ItemTemplate para vincular os valores em uma caixa de listagem de variáveis usando o seguinte 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>
Você também pode usar um modelo com ItemContainerStyle para vincular os valores a variáveis usando o seguinte 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>
Para os dois exemplos, você deve substituir, em seguida, o método toString () do ItemSource, conforme mostrado, usando o código a seguir. Esse código certifica-se de que o valor de AutomationProperties.Name é definido e é exclusivo, porque você não pode definir uma propriedade de automação exclusiva para cada item da lista de limite de dados usando a ligação. Definir um valor exclusivo para a automação de Properties.Name nesse caso é suficiente.
![]() |
---|
Com essa abordagem, o conteúdo interno do item da lista pode também ser definido como uma seqüência de caracteres na classe de funcionários por meio de ligação. Conforme mostrado no exemplo, o controle de botão dentro de cada item da lista é atribuído uma identificação exclusiva de automação que é a identificação do funcionário. |
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
}
Usar um modelo de controle
Você pode usar um modelo de controle para que cada instância de um tipo específico obtém uma propriedade de automação exclusiva quando ele estiver definido no código. Você deve criar o modelo para que o AutomationProperty se vincula a uma identificação exclusiva na instância do controle. O XAML a seguir demonstra uma abordagem para criar essa ligação com um modelo de controle.
<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>
Quando você define duas instâncias de um botão usando o modelo de controle, a identificação de automação é definida para a seqüência de caracteres de conteúdo exclusiva para os controles no modelo, conforme mostrado no seguinte XAML.
<Button Content=”Button1” Style="{StaticResource MyButton}" Width="140"/>
<Button Content=”Button2” Style="{StaticResource MyButton}" Width="140"/>
Grades de dados
O XAML a seguir dá um exemplo de um controle de grade de dados do Silverlight que está vinculado a dados.
<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>
O código a seguir mostra como o conteúdo da grade de dados é preenchido a partir de uma item de origem.
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;
Por padrão, esse código irá atribuir o mesmo valor para AutomationProperties.Name para cada linha na grade de dados. Esse valor é o valor retornado por toString () para o objeto PersonalDetails. Para alterar esse valor será exclusivo para cada linha na grade de dados, você deve substituir o método toString () do método ItemsSource. Por exemplo, você pode usar o seguinte código para substituir o método toString () para que ele retorne um valor exclusivo que é então atribuído à AutomationProperties.Name.
public override string ToString()
{
return name.ToString() + age.ToString();
}
Controles dinâmicos
Se você tem controles que são criados dinamicamente a partir do seu código e não criadas estaticamente ou através de modelos nos arquivos XAML, você deve definir as propriedades de conteúdo ou o nome do controle. Isso garante que cada controle dinâmico tem uma propriedade exclusiva de automação. Por exemplo, se você tiver uma caixa de seleção deve ser exibida quando você seleciona um item de lista, você pode definir essas propriedades, conforme mostrado no exemplo de código a seguir.
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);
}