문제

Is there any real difference between the XAML Propertys AutomationProperties.AutomationId and AutomationProperties.Name?

And most importantly, is there any reason to choose one over the other?


Neither of them seem unique to me although msdn says so about .AutomationId: "The string that uniquely identifies the specified element."

I tested a WPF application with 2 buttons each with the same .AutomationId within the same tree path, and the .AutomationId is not unique at all.

XAML allows me to give them the same .AutomationId, and if I search for them via the following code, it returns both Buttons.

PropertyCondition cond = new PropertyCondition(AutomationElement.AutomationIdProperty, "myButton");
returnedAEs = myMainWindow.FindAll(TreeScope.Children, cond);
foreach (AutomationElement element in returnedAEs)
{
//...enters here 2 times
}

XAML:

<Window ... >
<Grid ...>
<Button ... AutomationProperties.AutomationId="myButton"/>
<Button ... AutomationProperties.AutomationId="myButton"/>
<Window ... >
</Grid>
</Window>
도움이 되었습니까?

해결책

Here are some differences I found:

  1. It seems like Inspect.exe (former UISpy.exe) can only read .AutomationId, but not .AutomationName
  2. this two links about name and automationId might be useful as well. biggest difference from the two links: "If AutomationProperties.AutomationId is not specifically set, it returns the AutomationProperties.Name property value." this is not specified for the name property.
  3. If neither AutomationProperties.AutomationId nor AutomationProperties.Name are set, and in xaml the Name (not x:Name, that one doesn't work!!) is set, then the AutomationProperties.AutomationId is set to the same value as the Name Property is (be aware that I mean two differnt things with the Name (standard XAML Property) and AutomationProperties.Name!!)
  4. If for instance the following TextBlock is used:

    <TextBlock x:Name="msgStatus"
        Text="idle"
        ... />
    

    the value "idle" of the Text Property can be accessed by AutomationProperties.Name! The same applies for reading the text of Labels. A Labels Content can also be read by the AutomationProperties.Name(if the AutomationProperties.Name is not specififed in the .xaml)!

다른 팁

It really just may be a matter of context and maintenance. Most people would expect the ID to be used for something like the Tag attribute on a control, to convey information about the base object that is not otherwise available through a standard property and, in this case, is also a form of identification. The Name is just that, a name. You might not have any issues in your own code using the two interchangeably, as long as you keep track of it and remember you've done so, but if this code had to be integrated into someone else's code, or you yourself have to re-visit it some months/years later, the usage of the properties in ways in which they were not intended could be problematic. Note that you might be able to give two different buttons the same ID, but you cannot give them the same Name. As counter-intuitive as it might seem, this actually gives you more flexibility for what to do with that ID. For example, that ID might be used to very simply identify what page that button resides on. All the buttons on that are on a particular Page might have an AutomationID of '1'. But they each have their own unique Name. In such a case, your little method to return all of the buttons on Page '1' could be very handy.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top