Difference AutomationProperties.AutomationId AutomationProperties.Name

8 浏览
0 Comments

Difference AutomationProperties.AutomationId AutomationProperties.Name

XAML属性AutomationProperties.AutomationId和AutomationProperties.Name之间有什么真正的区别吗?最重要的是,选择其中一个有什么理由吗?

对我来说,它们都不是独特的,尽管msdn对.AutomationId这样说:

"唯一标识指定元素的字符串。"

我测试了一个带有两个按钮的WPF应用程序,它们在同一树路径中具有相同的.AutomationId,但.AutomationId并不是唯一的。

XAML允许我给它们相同的.AutomationId,并且如果我通过以下代码搜索它们,它会返回两个按钮。

PropertyCondition cond = new PropertyCondition(AutomationElement.AutomationIdProperty, "myButton");
returnedAEs = myMainWindow.FindAll(TreeScope.Children, cond);
foreach (AutomationElement element in returnedAEs)
{
//...在这里进入两次
}

XAML:



0
0 Comments

Difference AutomationProperties.AutomationId和AutomationProperties.Name这个问题的出现的原因是因为在使用这两个属性时的不正确使用方式。大多数人会期望ID用于类似于控件上的“Tag”属性,以传达关于基本对象的信息,而该信息在其他标准属性中无法获得,并且在这种情况下,ID也是一种标识形式。而Name属性只是一个名称。如果你在自己的代码中可以互换使用这两个属性而没有任何问题,只要你能够跟踪并记住你这样做了,但是如果这段代码必须集成到其他人的代码中,或者你自己在几个月/几年后需要重新访问它,那么在这些属性的用法不符合预期的情况下可能会出现问题。请注意,您可能可以给两个不同的按钮赋相同的ID,但是您不能给它们赋相同的Name。尽管这似乎反直觉,但实际上这为您提供了对该ID的更大灵活性。例如,该ID可以用于简单地标识该按钮所在的页面。在某个页面上的所有按钮可能都具有AutomationID为“1”。但是它们都有各自独特的Name。在这种情况下,您的小方法可以返回页面“1”上的所有按钮,这非常方便。

解决这个问题的方法是正确使用AutomationProperties.AutomationId和AutomationProperties.Name属性。确保在需要标识唯一控件的情况下使用AutomationId属性,而不是Name属性。同时,遵循文档中关于这两个属性的使用方式和限制。这样可以确保代码的可维护性和可扩展性,在将代码集成到其他项目中或者长时间后重新访问代码时不会出现问题。

0
0 Comments

在上述内容中,提到了AutomationProperties.AutomationId和AutomationProperties.Name之间的不同之处。下面是这个问题出现的原因以及解决方法的总结:

问题的原因:

1. Inspect.exe(以前的UISpy.exe)只能读取.AutomationId,而不能读取.AutomationName。

2. 如果没有明确设置AutomationProperties.AutomationId属性,则返回AutomationProperties.Name属性的值。但是对于Name属性,没有指定此行为。

解决方法:

1. 在XAML中,如果没有设置AutomationProperties.AutomationId或AutomationProperties.Name属性,并且设置了Name属性(而不是x:Name),则AutomationProperties.AutomationId属性将被设置为与Name属性相同的值。

2. 对于TextBlock和Label元素,如果没有在.xaml文件中明确设置AutomationProperties.Name属性,可以通过AutomationProperties.Name属性读取元素的文本内容。

3. 在WPF应用程序中,Inspect.exe工具可以同时读取Name和ID。Name可以在LegacyAccessible.Name下找到(该名称也在树中使用)。这表明Name只是来自MSAA的传统。有时,元素的内容被用作Name在inspect.exe中,但在AutomationProperties.GetName中没有反映出来(我不知道在WPF中如何获取这个)。

在Windows应用程序中,AutomationProperties.AutomationId和AutomationProperties.Name之间存在一些差异。Inspect.exe工具只能读取.AutomationId,而.AutomationName无法读取。对于没有明确设置AutomationProperties.AutomationId属性的元素,可以通过AutomationProperties.Name属性来获取值。在WPF应用程序中,Inspect.exe工具可以同时读取Name和ID,但有时元素的内容在AutomationProperties.GetName中无法获取。

0