Как узнать, доступен ли 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");
                }
            }
        }
Другие вопросы по тегам