□ 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.
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.
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
.
private void Form1_Load(object sender, EventArgs e) {
Cursor.Current = Cursors.WaitCursor;
try {
// Загружаем данные DataSet
DataSet ds = new DataSet();
ds.ReadXml(@"\Program Files\DataGrid_CS\artists.xml");
grdArtists.DataSource = ds.Tables[0];
} catch (Exception) {
MessageBox.Show("Не могу загрузить данные в DataGrid!", this.Text);
}
// Устанавливаем стили
DataGridTableStyle ts = new DataGridTableStyle();
ts.MappingName = "Order";
DataGridColumnStyle artistDate = new DataGridTextBoxColumn();
artistDate.MappingName = "BirthDate";
artistDate.HeaderText = "Дата рождения";
ts.GridColumnStyles.Add(artistDate);
DataGridColumnStyle artistName = new DataGridTextBoxColumn();
artistName.MappingName = "ArtistName";
artistName.HeaderText = "Артист";
artistName.Width = this.Width - artistDate.Width - 35;
ts.GridColumnStyles.Add(artistName);
grdArtists.TableStyles.Add(ts);
Cursor.Current = Cursors.Default;
}
В данном примере из XML-файла извлекаются данные, относящиеся к фамилии артиста и дате его рождения. Остальная информация игнорируется. При загрузке приложения в элемент DataGrid
записываются требуемые данные. На рис. 3.16 показан внешний вид приложения.
Рис. 3.16. Пример работы с элементом DataGrid