Резюме
В моем приложении WPF мне был нужен TabControl с кнопками слева, поэтому я определил ControlTemplate с нужным мне макетом, и он работал нормально.
Однако инструмент автоматического тестирования моего тестировщика не может видеть никакого содержимого вкладок, включая текущую выбранную вкладку.
Вопрос: Как я могу обеспечить возможность тестирования моего TabControl с помощью инструментов автоматического тестирования, при этом определяя ControlTemplate?
Детали
Я разрабатываю приложение WPF с использованием WPF 3.5
Мой тестер использует автоматизированный инструмент тестирования под названием QTP
Он говорит, что может протестировать все, что вы можете увидеть с помощью UISpy.exe
- Когда я использую обычный TabControl без примененного шаблона, UISpy может видеть содержимое выбранной в данный момент вкладки.
- Однако, когда я использую ContentTemplate для изменения макета (код показан ниже), UISpy по-прежнему может видеть заголовки вкладок ... но не может видеть содержимое.
Пример приложения WPF (Xaml):
<Window x:Class="TabControlTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Tab Control Test"
Height="300"
Width="300">
<Window.Resources>
<ControlTemplate x:Key="ButtonsOnLeftTabLayout"
TargetType="{x:Type TabControl}">
<DockPanel>
<StackPanel DockPanel.Dock="Left"
IsItemsHost="True" />
<ContentPresenter Content="{TemplateBinding SelectedContent}" />
</DockPanel>
</ControlTemplate>
</Window.Resources>
<TabControl Template="{StaticResource ButtonsOnLeftTabLayout}">
<TabItem Header="Tab 1">
<StackPanel>
<Button HorizontalAlignment="Center">Button 1</Button>
</StackPanel>
</TabItem>
<TabItem Header="Tab 2">
<StackPanel>
<Button HorizontalAlignment="Center">Button 2</Button>
</StackPanel>
</TabItem>
</TabControl>
</Window>
Что мой поиск нашел до сих пор:
- Куча вещей о необходимости написать собственный TabControl с пользовательским AutomationPeer (например, MSFT ответ на вопрос форума UI Automation: доступ к элементам управления в ControlTemplate , публикация в блоге Custom Controls и UI Automation ). Но каждый мой инстинкт говорит, что это сумасшедшее излишество: «Должен быть более простой путь!»
- Некоторые предложения о присвоении ContentPresenter имени, или x: Name, или AutomationProperties.AutomationId - ни один из которых не имеет никакого эффекта
(После поиска я наконец-то нашел ответ, но это заняло больше времени, чем я ожидал, и ранние результаты AutomationPeer были действительно неверны, поэтому я пишу это как SO вопрос и ответ на случай, если это поможет кому-нибудь еще в будущем)