Automatización UIA con ToolStripStatusLabel
-
06-07-2019 - |
Pregunta
Tengo una aplicación WinForms y parece que no puedo acceder al texto de un ToolStripStatusLabel
a través de UIAutomation. Microsoft implica que el soporte para StatusStrip
s (y presumiblemente elementos dentro de ellos) es limitado, pero esto parece un caso de uso lo suficientemente básico como para que funcione.
El control aparece con ControlType.Edit
en UISpy, y parece ser solo un cuadro de texto de solo lectura, sin embargo, su valor es siempre el mismo que su nombre, no su texto.
Las propiedades en UISpy son las siguientes:
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"
Básicamente, espero encontrar alguna forma de ir a myLabel.Text = " something "
y poder obtener ese valor de alguna manera a través de UIAutomation.
Solución
Establezca la propiedad AccessibleName
además de .Text
en el control ToolStripStatusLabel
. Funciona para mí usando White en un escenario similar:
statusLabel.Text = statusLabel.AccessibleName = " Nuevo valor de estado " ;;
Otros consejos
He tenido que solucionar este problema teniendo dos etiquetas separadas con texto diferente, y mostrando y ocultando la apropiada. Esto es suficiente para mis propósitos (probar con White), pero estoy muy sorprendido de que UIAutomation no muestre el valor del texto, básicamente significa que todo el texto en las barras de estado en las aplicaciones WinForms es inaccesible para los lectores de pantalla.
Nunca he tenido problemas para recuperar el texto de una etiqueta similar a la que usted describe. De hecho, el AutomationId
es incluso el mismo en mi aplicación. El hecho de que ControlType
se muestre como ControlType.Edit
es engañoso. p.ej. lo siguiente funcionará
statusText = (string)automationElement.GetCurrentPropertyValue(ValuePattern.ValueProperty);
Donde automationElement
se ha ubicado utilizando un método Find contra ControlType.Edit
con un AutomationId
de " StatusBar.Pane0 "
.