Элемент InputPanel

Элемент InputPanel

Элемент управления InputPanel позволяет вводить текстовую информацию при помощи виртуальной клавиатуры или панели распознавания знаков SIP (Soft Input Panel). Так как в полной версии .NET Framework данного элемента нет, то стоит рассмотреть его несколько подробнее.

Как правило, в карманных компьютерах нет клавиатуры, поэтому для ввода данных используется виртуальная клавиатура. В обычном состоянии она неактивна и находится в свернутом состоянии. Чтобы ее активировать, нужно щелкнуть стилусом по значку клавиатуры в нижнем правом углу экрана, где располагается меню или панель инструментов ToolBar. Тогда виртуальная клавиатура появится на экране, и пользователь сможет вводить текст.

Разработчик может программно управлять состоянием клавиатуры. Например, с помощью элемента InputPanel можно узнать текущее состояние SIP, возможность ее отображения и деактивации. Свойств и методов у элемента InputPanel не так уж много, но наиболее часто используемые члены класса приведены в следующем списке.

? Bounds — прямоугольник, определяющий размеры и позицию SIP.

? VisibleDesktop — прямоугольная часть экрана, на которой не отображается SIP.

? Enabled — возможность работы с SIP.

? EnabledChanged — событие, возникающее при изменении состояния SIP.

Свойства Bounds и VisibleDesktop доступны только для чтения и определяют прямоугольники, по которым можно судить о положении SIP и размерах клиентской области, не занятой SIP. Свойство VisibleDesktop определяет прямоугольник, которым ограничена область экрана, не закрытая SIP. Когда виртуальная клавиатура отображается, то условный прямоугольник поднимается от полоски навигации над окном SIP. Когда SIP скрыт, то прямоугольник занимает все пространство экрана.

Свойство Bounds описывает размеры и позицию виртуальной клавиатуры, когда она отображается на экране. Причем размеры этого прямоугольника не меняются, даже если виртуальная клавиатура скрыта.

Свойство Enabled имеет значение True, если виртуальная клавиатура отображается на экране. Значение свойства можно задавать программно, скрывая или отображая клавиатуру.

Если в приложении необходимо использовать элемент InputPanel, нужно следить, чтобы он при активации не загородил элементы управления на форме, иначе пользователь просто не сможет ввести данные.

Можно размещать текстовые поля на форме как можно выше, чтобы элемент InputPanel не мешал вводить данные. Но помимо этого можно отслеживать состояние виртуальной клавиатуры и при ее отображении передвигать вверх поля для ввода информации. В этом случае чаще всего приходится применять полосы прокрутки. Можно проиллюстрировать такое поведение примером, в котором элемент InputPanel будет активироваться, если текстовое поле получит фокус. А когда TextBox потеряет фокус, то клавиатура должна исчезнуть. Эта функциональность реализуется кодом, приведенным в листинге 3.23.

Листинг 3.23

private void txtTest_GotFocus(object sender, EventArgs e) {

 // Когда пользователь выбирает текстовое поле.

 // то автоматически активируем SIP

 inputPanel1.Enabled = true;

}

private void txtTest_LostFocus(object sender, EventArgs e) {

 // При потере фокуса сворачиваем SIP

 inputPanel1.Enabled = false;

}

В этом примере пришлось добавить на форму кнопку, иначе текстовое поле будет автоматически получать фокус при загрузке формы и приложение не будет работать так, как это задумывалось изначально. В данном случае именно кнопка будет получать фокус ввода при загрузке формы. Но для этого надо присвоить свойству кнопки TabIndex нулевое значение.

Теперь если стилусом активировать текстовое поле, то автоматически будет отображена виртуальная клавиатура. Если на появившейся клавиатуре нажать клавишу Tab или щелкнуть на кнопке с надписью Просто кнопка, то панель ввода автоматически свернется.

Элемент InputPanel поддерживает событие EnabledChanged, которое возникает при активации и деактивации панели ввода С его помощью можно расширить функциональность примера. Следует добавить еще одно текстовое поле в нижнюю часть формы. Сейчас нужно отследить событие EnabledChanged и отреагировать на него должным образом. При активации панели ввода текстовое поле должно сдвинуться вверх, чтобы пользователь мог ввести свои данные. Пример обработки этого события приведен в листинге 3.24.

Листинг 3.24

private void inputPanel1_EnabledChanged(object sender,EventArgs e) {

 // Отслеживаем состояние панели ввода

 // Свойство Bounds возвращает размеры и позицию SIP

 if (inputPanel1.Enabled == true)

  this.txtJump.Top = 200 — inputPanel1.Bounds.Height;

 else

  this.txtJump.Top = 200;

}

На рис. 3.15 показан внешний вид окна тестового приложения.

Рис. 3.15. Пример работы с элементом InputPanel

В этом примере позиция текстового поля была подобрана опытным путем, но в реальных проектах разработчик может программно вычислить высоту формы, панели ввода, текстового поля и других элементов формы, чтобы более точно определить позицию сдвига.