Как я могу определить ControlTemplate для своего TabControl, не нарушая автоматическое тестирование?

Резюме

В моем приложении 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>

Что до сих пор нашел мой поиск:

(После поиска я наконец нашел ответ, но это заняло больше времени, чем я ожидал, и ранние результаты AutomationPeer действительно были неверными, поэтому я пишу это как вопрос SO и самоответ, на случай, если это кому-то поможет еще в будущем)


person Daryn    schedule 03.09.2010    source источник


Ответы (1)


Нашел ответ в другом ответе MSFT на другой, но похожий вопрос форума msdn, Элементы управления TabControl отсутствуют для автоматизации пользовательского интерфейса.

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

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

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

person Daryn    schedule 03.09.2010
comment
существует проблема с .net 4.0 / 4.5, и это решение недействительно :( (проверьте последнее сообщение здесь: social.msdn.microsoft.com/Forums/vstudio/en-US /) есть идеи, как обойтись? - person milrom; 26.11.2013
comment
Извините, я давно не работал над этим проектом. Я бы посоветовал задать новый вопрос, ориентированный на .net 4.5, так же как этот вопрос нацелен на .net 3.5. - person Daryn; 26.11.2013