我正在努力使应用程序CUIT-Generator准备就绪。这意味着,作为示例,我将XAML设置器添加到设置DataGridRow
和Automation.ID
的{{1}}的样式中。工作得很好。
现在我的问题是AutomationName
ListView
包含ItemTemplate
,其中DataTemplate
又有自定义UI控件。
在自定义UI控件内的文本控件上录制任何操作时,它只会抓取自定义UI控件及其下方的层次结构,但它不会记录它位于ListView
内和ListViewItem
。
因此,在测试执行期间或在UIMap中选择控件并单击Search UI control
时无法找到控件。
我尝试在ListViewItem
和ListView
上设置AutomationID / Name,但这对记录的层次结构没有影响。
ListView
:
<ListView x:Name="sampleControl" Margin="3" ItemsSource="{Binding ObservableCollectionOfViewModelItems}">
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="AutomationProperties.Name">
<Setter.Value>
<Binding Path="AutoID"/>
</Setter.Value>
</Setter>
<Setter Property="AutomationProperties.AutomationId">
<Setter.Value>
<Binding Path="AutoID"/>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate>
<SampleNamespace:CustomUIControlView />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
CustomUIControlView
的代码:
<UserControl x:Class="SampleNamespace.CustomUIControlView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d">
<Border BorderThickness="3">
<Expander>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<TextBox Grid.Column="1" Grid.Row="0" Name="SampleBox1" Height="20" Margin="5" Text="{Binding SampleProp1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Grid.Column="1" Grid.Row="1" Name="SampleBox2" Height="20" Margin="5" Text="{Binding SampleProp2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Grid.Column="1" Grid.Row="2" Name="SampleBox3" Height="20" Margin="5" Text="{Binding SampleProp3, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="7" Name="SampleBox4" Height="20" Margin="5" Text="{Binding SampleProp4, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</Grid>
</Expander>
</Border>
</UserControl>
SampleBox1
上记录的操作的记录层次结构如下所示:
SampleAppWindow
---- CustomUIControlView
-------- Expander
------------ SampleBox1/TextBox
显然除了Window
之外,没有任何控件可以找到。
我知道我可以将录制的动作转移到C#代码,然后自己编辑层次结构和搜索属性,但我想避免这样做,因为每次涉及ListView
时我都要记住这样做在记录测试中。
我之所以提到这一点,因为SO或其他网站上的大多数解决方案都可以解决这个问题。
这是在Visual Studio 2017 15.3.5和.NET Framework 4.5.2上。
答案 0 :(得分:1)
我相当肯定你要求的东西超出了CodedUi代码生成器可以处理的范围。
我会从生成的对象结构中指出它完全错过了ListView
。我建议的路线首先是确保您可以找到ListView
,生成或您自己的代码,可能会调用DrawHighlight
来确定。我试图避免使用自己的代码来定义对象定义,但是编写自己的代码可能是可行的。
现在专门针对您的CustomUIControlView
,我建议您定义匹配它的匹配CodedUI
对象。原样,Expander
有4个孩子TextBoxes
。这会多次减少编码这个定义。如果您将生成的代码视为示例来编写这些代码。
根据您对设计器文件的看法,您还可以将ListView
或其自身的预期父节点声明为部分类,以将这些不匹配的子元素挂钩到单独的文件中,以避免被其擦除发电机。然后,您只需要使用小partial
语句编辑来更新设计器文件。