概括
在我的 WPF 应用程序中,我需要一个带有左侧按钮的 TabControl,因此我用我想要的布局定义了一个 ControlTemplate,它运行良好。
但是,我的测试人员的自动化测试工具看不到选项卡的任何内容,包括当前选择的选项卡。
问题:我怎样才能让我的 TabControl 可以被自动化测试工具测试,同时仍然定义 ControlTemplate?
细节
我正在使用 WPF 3.5 开发 WPF 应用程序我的测试人员正在使用一个名为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 编写自定义 TabControl 的内容(例如,MSFT 对论坛问题UI 自动化的回答:在 ControlTemplate 中访问控件,博客发布自定义控件和 UI 自动化)。但我的直觉告诉我这太疯狂了,“一定有更简单的方法!”
- 关于为 ContentPresenter 指定名称、x:Name 或 AutomationProperties.AutomationId 的一些建议——这些都没有任何效果
(经过搜索,我终于找到了答案,但花费的时间比我想象的要长,而且 AutomationPeer 的早期发现确实不正确,所以我把它写成一个 SO 问题和自我回答,以防它在未来对其他人有所帮助)