UIAutomation con ToolStripStatusLabel
-
06-07-2019 - |
Domanda
Ho un'app WinForms e non riesco ad accedere al testo di un ToolStripStatusLabel
tramite UIAutomation. Microsoft implica che il supporto per StatusStrip
s (e presumibilmente oggetti al loro interno) è limitato, ma questo sembra un caso d'uso abbastanza semplice da funzionare.
Il controllo appare con ControlType.Edit
in UISpy e sembra essere solo una casella di testo di sola lettura, tuttavia il suo valore è sempre uguale al suo nome, non al suo testo.
Le proprietà in UISpy sono le seguenti:
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"
Fondamentalmente, spero in qualche modo di andare myLabel.Text = " qualcosa "
ed essere in grado di ottenere quel valore in qualche modo attraverso UIAutomation.
Soluzione
Imposta la proprietà AccessibleName
oltre a .Text
sul controllo ToolStripStatusLabel
. Funziona per me usando White in uno scenario simile:
statusLabel.Text = statusLabel.AccessibleName = " Nuovo valore di stato " ;;
Altri suggerimenti
Ho dovuto aggirare questo problema avendo due etichette separate con testo diverso e mostrando e nascondendo quella appropriata. Questo è abbastanza per i miei scopi (test con White), ma sono molto sorpreso che UIAutomation non affronti il ??valore del testo - fondamentalmente significa che tutto il testo nelle barre di stato nelle applicazioni WinForms è inaccessibile agli screen reader.
Non ho mai avuto problemi a recuperare il testo di un'etichetta simile a quello che descrivi. In effetti AutomationId
è persino lo stesso nella mia applicazione. Il fatto che ControlType
sia mostrato come ControlType.Edit
è fuorviante. per esempio. il seguente funzionerà
statusText = (string)automationElement.GetCurrentPropertyValue(ValuePattern.ValueProperty);
Dove automationElement
è stato individuato utilizzando un metodo Find in ControlType.Edit
con un AutomationId
di " StatusBar.Pane0 "
.