Свойство 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
В этом примере позиция текстового поля была подобрана опытным путем, но в реальных проектах разработчик может программно вычислить высоту формы, панели ввода, текстового поля и других элементов формы, чтобы более точно определить позицию сдвига.
Элемент управления DataGrid
Элемент управления DataGridпозволяет отображать данные в виде таблицы, как это сделано в электронной таблице MS Excel. Как и многие другие элементы управления, он имеет обрезанные возможности по сравнению с полной версией .NET Framework. Например, отключена поддержка свойства DataMember.
Элемент управления DataGridможет быть связан с источниками данных при помощи свойства DataSource. Рассмотрим простейший пример работы с данным элементом. Прежде всего, потребуется создать XML-файл, содержащий некоторые данные. Для примера был использован файл artists.xml , в котором содержится информация о некоторых известных артистов шоу-бизнеса. Файл содержит записи о фамилии, дате рождения и адресе проживания. Созданный файл нужно добавить в проект, расположить на форме элемент DataGridи присвоить ему имя grdArtists. В листинге 3.25 приведен код обработчика события Form1_Load.
Листинг 3.25
private void Form1_Load(object sender, EventArgs e) {
Читать дальше