コード化された UI テストを実行する場合や、Silverlight 4 アプリケーション用に操作の記録を作成する場合は、各コントロールを識別する一意のオートメーション プロパティが必要です。 コントロールが認識されるように Silverlight アプリケーションをセットアップする方法の詳細については、「方法: テスト用に Silverlight アプリケーションを設定する」を参照してください。
アプリケーション内の Silverlight コントロールの種類に基づいて、一意のオートメーション プロパティを割り当てることができます。 このトピックでは、次のような状況において、この一意のオートメーション プロパティを割り当てる方法について説明します。
コントロールの静的な XAML 定義
Expression Blend を使用して一意のオートメーション プロパティを割り当てる
データ テンプレートを使用する
コントロール テンプレートを使用する
データ グリッド
ダイナミック コントロール
一意のオートメーション プロパティを割り当てる方法
静的な 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 を使用して静的に作成されたコントロールの場合のみ行うことができます。
既存のコントロールに一意の名前を付けるには
次の図に示されているように、[ツール] メニューの [対話型要素に名前を付ける] をクリックします。
作成されるコントロールに自動的に一意の名前を付けるには
[ツール] メニューの [オプション] をポイントし、[プロジェクト] をクリックします。 次の図に示されているように、[対話型要素作成時に自動的に名前を付ける] を選択し、[OK] をクリックします。
データ テンプレートを使用する
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 クラスの文字列に設定することもできます。 この例に示されているように、各リスト項目内のボタン コントロールには、Employee ID を表す一意のオートメーション 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>
このコントロール テンプレートを使用して 1 つのボタンのインスタンスを 2 つ定義すると、テンプレート内のコントロールのオートメーション 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 が割り当てられます。 この値は、PersonalDetails オブジェクトに対して ToString() から返された値です。 この値がデータ グリッドの各行に対して一意になるように変更するには、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);
}