Чтение онлайн

на главную - закладки

Жанры

Программирование мобильных устройств на платформе .NET Compact Framework

Салмре Иво

Шрифт:

 newNeighborhoodNodes = new TreeNode[4];

 newNeighborhoodNodes[0] = new TreeNode("Capitol Hill");

 newNeighborhoodNodes[1] = new TreeNode("Chelsea");

 newNeighborhoodNodes[2] = new TreeNode("Downtown");

 newNeighborhoodNodes[3] = new TreeNode("South Bay");

 //Добавить дочерние узлы в элемент управления

 TreeView tnAddTo.Nodes.AddRange(newNeighborhoodNodes);

 tvControl.EndUpdate;

}

Приведенный код демонстрирует, что,

проявив немного изобретательности и написав совсем небольшой объем дополнительного кода, можно отложить заполнение сложного пользовательского интерфейса данными до тех пор, пока они не понадобятся пользователю. Независимо от того, работаете ли вы в .NET Compact Framework или в любой другой среде выполнения для мобильных устройств, откладывание заполнения данными расширяемых элементов управления пользовательских интерфейсов до того момента, когда возникнет действительная необходимость в них, является чрезвычайно мощным методом.

Будьте внимательны, когда работаете с кодом, управляемым событиями

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

Довольно часто причина низкой производительности приложения кроется в том, что события, генерируемые кодом, ошибочно обрабатываются так, как если бы они были сгенерированы в результате действий пользователя.

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

В листинге 11.3 содержится код, который необходимо вставить в класс Form. Для создания приложения потребуется выполнить следующие действия:

1. Начните новый проект Smart Device в Visual Studio .NET, выбрав в качестве целевой платформы Pocket PC.

2. Добавьте в форму Form элементы управления TextBox, Label, ListBox и Button.

3. Дважды щелкните на кнопке Button в окне конструктора форм; в результате этого будет создан и подключен к кнопке приведенный ниже обработчик событий button1_Click. Введите соответствующий код из листинга 11.3, который будет реагировать на это событие.

4. Дважды щелкните на элементе управления TextBox в окне конструктора форм; в результате этого будет создан и подключен к текстовому окну приведенный ниже обработчик событий textBoxl_TextChanged. Введите соответствующий код из листинга 11.3, который будет реагировать на это событие.

5. Скомпилируйте пример и запустите его на выполнение.

6. Введите текст в текстовое поле; обратите внимание, что каждое нажатие клавиши приводит к выполнению приведенного ниже кода обработки события textBox1_TextChanged.

7. Щелкните на кнопке Button; обратите внимание, что это также приводит к выполнению приведенного ниже кода обработки события textBox1_TextChanged.

НА ЗАМЕТКУ

При выполнении приложения на платформе .NET Compact Framework 1.1 в случае установки значения свойства Text элемента управления TextBox программным путем событие TextChanged в действительности запускается дважды.

Выполнение того же кода на настольном компьютере сопровождается только однократным запуском указанного события. Вероятно, поведение последующих версий NET Compact Framework будет изменено таким образом, чтобы оно совпадало с поведением .NET Framework (однократный запуск события). События — коварная вещь. Будьте очень внимательны в своих предположениях относительно того как и когда запускаются события.

Листинг 11.3. Запуск обработчика событий при изменении содержимого элемента TextBox программным путем 

int m_eventTriggerCount;

private void textBox1_TextChanged(object sender, System.EventArgs e) {

 m_eventTriggerCount++;

 //Обновить
надпись для отображения количества событий

 label1.Text = "Events: #" + m_eventTriggerCount.ToString;

 //Внести каждое событие в список

 listBox1.Items.Add(m_eventTriggerCount.ToString + textBox1.Text);

}

private void button1_Click(object sender, System.EventArgs e) {

 //Запускает событие TextChanged так же,

 //как если бы текст был введен пользователем

 textBox1.Text = "Hello World";

}

Как видно из листинга 11.3, программная установка свойства Text элемента управления TextBox запускает тот же код обработки событий, который запускался бы при вводе текста пользователем. В зависимости от того, какие допущения вами сделаны, результаты могут как совпадать, так и не совпадать с ожидаемыми. Программисты часто пишут коды, предназначенные для заполнения пользовательских интерфейсов данными после их извлечения из внешнего источника. При этом устанавливаются свойства Checked переключателей RadioButton и флажков CheckBox, заполняются значения текстовых полей TextBox, заполняются элементами списки ListBox и ComboBox и так далее. Во многих случаях программисты предполагают, что выполнение всех этих установочных действий не приводит к запуску событий пользовательского интерфейса. Обычно в намерения программиста не входит, чтобы эти события запускались, поскольку пользовательский интерфейс всего лишь подготавливается к тому, чтобы пользователь мог им воспользоваться. Очень часто программисты, которые разрабатывают приложение, хотят, чтобы код обработки событий приложения запускался лишь тогда, когда происходит внешнее событие, например, поступает сигнал таймера, пользователь выполняет щелчок на кнопке или вводит текст в элемент управления и тому подобное.

Не позволяйте событиям заставать вас врасплох

Сложность работы с кодами, управляемыми событиями, связана с тем, что невозможно заранее знать, когда именно будет вызван код того или иного обработчика события. Просматривая исходный код приложения, вы можете точно сказать, когда вызываются библиотечные функции или другие части кода приложения, но ничто не укажет вам на то, когда именно среда выполнения запустит событие. По этой причине большинство разработчиков просто делают относительно этого некоторые предположения, которые даже не удосуживаются тщательно проверять. Кроме того, по мере увеличения объема приложения за счет дальнейшего добавления пользовательского кода и соответствующего усложнения его внутренней структуры в нем появляется все больше кода, предназначенного для генерации и обработки событий пользовательского интерфейса; из-за этого также могут возникать весьма тонкие взаимодействия, обнаружить которые простым просмотром исходного текста кода очень трудно. Так, код, реагирующий на выбор элемента в списке ListBox, может запускать код, инициирующий обновление свойств элементов управления CheckBox и TextBox, как показано в приведенном ниже примере:

textboxUserName.Text = selectedRecord.Username;

checkboxDeliverPackageToHomeAddress.Checked = selectedRecord.DeliverToHome;

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

Поделиться:
Популярные книги

Снегурка для опера Морозова

Бигси Анна
4. Опасная работа
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Снегурка для опера Морозова

(Не)свободные, или Фиктивная жена драконьего военачальника

Найт Алекс
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
(Не)свободные, или Фиктивная жена драконьего военачальника

Архил…? Книга 3

Кожевников Павел
3. Архил...?
Фантастика:
фэнтези
попаданцы
альтернативная история
7.00
рейтинг книги
Архил…? Книга 3

Ну привет, заучка...

Зайцева Мария
Любовные романы:
эро литература
короткие любовные романы
8.30
рейтинг книги
Ну привет, заучка...

Генерал-адмирал. Тетралогия

Злотников Роман Валерьевич
Генерал-адмирал
Фантастика:
альтернативная история
8.71
рейтинг книги
Генерал-адмирал. Тетралогия

Не грози Дубровскому! Том IX

Панарин Антон
9. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том IX

Убивать чтобы жить 3

Бор Жорж
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 3

Лорд Системы 4

Токсик Саша
4. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 4

Рота Его Величества

Дроздов Анатолий Федорович
Новые герои
Фантастика:
боевая фантастика
8.55
рейтинг книги
Рота Его Величества

Мастер Разума IV

Кронос Александр
4. Мастер Разума
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер Разума IV

Возвышение Меркурия. Книга 13

Кронос Александр
13. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 13

Ученик. Книга третья

Первухин Андрей Евгеньевич
3. Ученик
Фантастика:
фэнтези
7.64
рейтинг книги
Ученик. Книга третья

Кодекс Крови. Книга V

Борзых М.
5. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга V

Сердце Дракона. Том 11

Клеванский Кирилл Сергеевич
11. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
6.50
рейтинг книги
Сердце Дракона. Том 11