Как я могу определить ControlTemplate для моего TabControl, не прерывая автоматизированное тестирование? - PullRequest
6 голосов
/ 03 сентября 2010

Резюме

В моем приложении 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 вопрос и ответ на случай, если это поможет кому-нибудь еще в будущем)

1 Ответ

8 голосов
/ 03 сентября 2010

Найден ответ в другом ответе MSFT на другой, но похожий вопрос форума MSDN, Для UI Automation отсутствуют элементы управления TabControl .

Чтобы заставить автоматизацию пользовательского интерфейса работать с ContentTemplated TabControl, добавьте атрибут Name = "PART_SelectedContentHost" в ContentPresenter, например,

<ContentPresenter Name="PART_SelectedContentHost"
                  Content="{TemplateBinding SelectedContent}"/>

Это все, что нужно. UISpy теперь может видеть содержимое выбранной вкладки.

...