Резюме
В моем приложении 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 на вопрос форума Автоматизация пользовательского интерфейса: доступ к элементу управления в ControlTemplate, публикация в блоге Пользовательские элементы управления и автоматизация пользовательского интерфейса). Но каждый мой инстинкт говорит, что это безумный перебор, «должен быть способ попроще!»
- Некоторые предложения по присвоению ContentPresenter имени, x: Name или AutomationProperties.AutomationId - ни одно из которых не имеет никакого эффекта
(После поиска я наконец нашел ответ, но это заняло больше времени, чем я ожидал, и ранние результаты AutomationPeer действительно были неверными, поэтому я пишу это как вопрос SO и самоответ, на случай, если это кому-то поможет еще в будущем)