UIAutomation avec ToolStripStatusLabel
-
06-07-2019 - |
Question
J'ai une application WinForms et je n'arrive pas à accéder au texte d'un ToolStripStatusLabel
via UIAutomation. Microsoft implique que la prise en charge de StatusStrip
(et vraisemblablement les éléments qu’ils contiennent) est limité, mais cela semble être un cas d’utilisation assez basique pour que cela fonctionne.
Le contrôle apparaît avec ControlType.Edit
dans UISpy et semble n'être qu'une zone de texte en lecture seule. Toutefois, sa valeur est toujours identique à son nom, pas son texte.
Les propriétés dans UISpy sont les suivantes:
AutomationElement
General Accessibility
AccessKey: ""
AcceleratorKey: ""
IsKeyboardFocusable: "False"
LabeledBy: "(null)"
HelpText: ""
State
IsEnabled: "True"
HasKeyboardFocus: "False"
Identification
ClassName: ""
ControlType: "ControlType.Edit"
Culture: "(null)"
AutomationId: "StatusBar.Pane0"
LocalizedControlType: "edit"
Name: "My Label"
ProcessId: "3972 (*****)"
RuntimeId: "42 134002 0"
IsPassword: "False"
IsControlElement: "True"
IsContentElement: "True"
Visibility
BoundingRectangle: "(9, 273, 79, 17)"
ClickablePoint: "48,281"
IsOffscreen: "False"
ControlPatterns
GridItem
Row: "0"
Column: "0"
RowSpan: "1"
ColumnSpan: "1"
ContainingGrid: ""status bar" "statusStrip""
Value
Value: "My Label"
IsReadOnly: "True"
En gros, j'espère trouver un moyen d'aller myLabel.Text = "quelque chose"
et de pouvoir obtenir cette valeur d'une manière ou d'une autre via UIAutomation.
La solution
Définissez la propriété AccessibleName
en plus de .Text
sur le contrôle ToolStripStatusLabel
. Cela fonctionne pour moi en utilisant White dans un scénario similaire:
statusLabel.Text = statusLabel.AccessibleName = " Nouvelle valeur d'état " ;;
Autres conseils
J'ai dû contourner ce problème en disposant de deux étiquettes distinctes avec un texte différent et en affichant et en masquant celle qui convient. C'est suffisant pour mes besoins (tester avec White), mais je suis très surpris que UIAutomation ne fasse pas apparaître la valeur de texte - cela signifie en gros que tout le texte des barres d'état des applications WinForms est inaccessible aux lecteurs d'écran.
Je n’ai jamais eu de difficulté à récupérer le texte d’une étiquette semblable à ce que vous décrivez. En fait, AutomationId
est même identique dans mon application. Le fait que ControlType
apparaisse sous la forme ControlType.Edit
est trompeur. par exemple. ce qui suit fonctionnera
statusText = (string)automationElement.GetCurrentPropertyValue(ValuePattern.ValueProperty);
Où automationElement
a été situé à l'aide d'une méthode Find par rapport à ControlType.Edit
avec un AutomationId
de " StatusBar.Pane0 "
.