Как узнать, доступен ли TextBox только для чтения или нет
Я разрабатываю приложение для автоматизации других приложений. Я хочу иметь возможность определить, доступен ли элемент textbox в "другом" приложении только для чтения или нет. В случае однострочных текстовых полей MS UI Automation предоставляет ValuePattern, и я могу получить атрибут readonly из этого шаблона, но когда у нас есть многострочное текстовое поле, ValuePattern недоступен, и я могу получить доступ только к TextPattern и ScrollPattern. Как получить атрибут readonly из многострочного текстового поля с помощью MS UI Automation?
PS Я пытался найти что-то об этом в Интернете, но похоже, что в целом не так много информации о MS UI Automation.
2 ответа
TextPattern
Шаблон предоставляет способ проверки диапазонов для статуса только для чтения. Проверка полная DocumentRange
говорит вам, если все текстовое поле только для чтения:
TextPattern textPattern = textProvider.GetCurrentPattern(TextPattern.Pattern) as TextPattern;
object roAttribute = textPattern.DocumentRange.GetAttributeValue(TextPattern.IsReadOnlyAttribute);
if (roAttribute != TextPattern.MixedAttributeValue)
{
bool isReadOnly = (bool)roAttribute;
}
else
{
// Different subranges have different read only statuses
}
Например, чтобы проверить, если textBox2
только для чтения.
Метод проверки, если textBox2
только для чтения:
private bool checkReadOnly(Control Ctrl)
{
bool isReadOnly = false;
if(((TextBox)Ctrl).ReadOnly == true)
{
isReadOnly = true;
}
else
{
isReadOnly = false;
}
return isReadOnly;
}
Используя метод события нажатия кнопки:
private void button1_Click(object sender, EventArgs e)
{
if (checkReadOnly(textBox2) == true)
{
MessageBox.Show("textbox is readonly");
}
else
{
MessageBox.Show("not read only textbox");
}
}
Проверить все textboxes
в форме, только для чтения или без использования того же метода:
private void button2_Click(object sender, EventArgs e)
{
foreach(Control ct in Controls.OfType<TextBox>())
{
if (checkReadOnly(ct) == true)
{
MessageBox.Show(ct.Name + " textbox is readonly");
}
else
{
MessageBox.Show(ct.Name + " not read only textbox");
}
}
}