Uiautomation com ToolstripStatuslabel
-
06-07-2019 - |
Pergunta
Eu tenho um aplicativo Winforms e não consigo acessar o texto de um ToolStripStatusLabel
Através de Uiautomation. Microsoft implica que o apoio para StatusStrip
S (e presumivelmente itens dentro deles) é limitado, mas isso parece ser um caso de uso básico o suficiente para que funcione.
O controle aparece com ControlType.Edit
Em Uispy, e parece ser apenas uma caixa de texto somente leitura, no entanto, seu valor é sempre o mesmo que seu nome, não seu texto.
As propriedades em Uispy são as seguintes:
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"
Basicamente, espero que seja algum caminho para ir myLabel.Text = "something"
e ser capaz de obter esse valor de alguma forma através da Uiautomation.
Solução
Colocou o AccessibleName
propriedade além de .Text
no ToolStripStatusLabel
ao controle. Funciona para mim usando o branco em um cenário semelhante:
statusLabel.Text = statusLabel.AccessibleName = "New status value";
Outras dicas
Eu tive que contornar isso tendo dois rótulos separados com texto diferente e mostrando e escondendo o apropriado. Isso é suficiente para meus propósitos (testando com branco), mas estou muito surpreso que o uiautomation não tenha superado o valor do texto - basicamente significa que todo o texto nas barras de status nos aplicativos Winforms é inacessível para os leitores de tela.
Nunca tive problemas para recuperar o texto de um rótulo semelhante ao que você descreve. De fato AutomationId
é mesmo o mesmo no meu aplicativo. O fato de que ControlType
é mostrado como ControlType.Edit
é enganoso. por exemplo, o seguinte funcionará
statusText = (string)automationElement.GetCurrentPropertyValue(ValuePattern.ValueProperty);
Onde automationElement
foi localizado usando um método de localização contra ControlType.Edit
com um AutomationId
do "StatusBar.Pane0"
.