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

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

Жанры

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

Салмре Иво

Шрифт:

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

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

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

.NET Compact Framework: не все поддерживаемые обработчики прерываний предоставляются конструктором форм Visual Studio .NET

Платформа .NET Compact Framework поддерживает подмножество управляющих событий платформы .NET Compact Framework, ориентированной на настольные компьютеры. Следует отметить, что одно лишь наличие в .NET Compact Framework сигнатуры какого-либо события еще не является гарантией того, что это событие может быть возбуждено во время выполнения. Могут существовать специфические условия совместимости или причины, связанные со свойствами объектного наследования, в силу которых определение события необходимо было связать с элементом управления, но само событие запускаться во время выполнения в .NET Compact Framework не будет. Единственный способ прояснения подобных ситуаций состоит в том, чтобы подключить событие к элементу управления и посмотреть, будет ли оно запущено во время выполнения. Эта ситуация дополнительно осложняется тем фактом, что не все события, поддерживаемые платформой .NET Compact Framework, отражаются в графической среде проектирования Visual Studio .NET. Среди поддерживаемых событий имеются и такие, которые не фигурируют в списке событий C# в панели свойств или в выпадающем списке событий Visual Basic .NET в редакторе кода.

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

Если вы хотите использовать событие, которое поддерживается в .NET Compact Framework, но не предлагается в качестве доступного в среде проектирования Visual Studio .NET, вам придется вручную вставить одну строку кода в функцию InitializeComponent формы, содержащей данный элемент управления. Функцию InitializeComponent вы найдете в обычно скрытом или свернутом разделе "Windows Form Designer-Generated Code" редактора кода класса.

Добавление обработчика событий BeforeExpand в элемент управления TreeView иллюстрирует приведенный ниже фрагмент кода:

#region Windows Form Designer generated code

private void InitializeComponent

… строки кода для других элементов управления …

//

// treeView1

//

this.treeView1.ImageIndex = -1;

this.treeView1.Location = new System.Drawing.Point(72, 48);

this.treeView1.Name = "treeView1";

this.treeView1.SelectedImageIndex = -1;

this.treeView1.Size = new System.Drawing.Size(168, 176);

this.treeView1.TabIndex = 0;

//ОДНОСТРОЧНЫЙ КОД ДЛЯ ПОДКЛЮЧЕНИЯ СОБЫТИЯ, КОТОРЫЙ ВЫ ДОЛЖНЫ ВСТАВИТЬ

this.treeView1.BeforeExpand += new.System.Windows.Forms.TreeViewCancelEventHandler(this.TreeView1BeforeExpand);

… строки кода для других элементов управления …

Представленный выше код подключает обработчик события BeforeExpand элемента управления treeView1. Функция обработчика события должна иметь специальную сигнатуру. В данном случае она имеет следующий вид:

private void TreeView1BeforeExpand(object sender, System.Windows.Forms.TreeViewCancelEventArgs e) {}

Неплохим

способом обеспечения автоматической генерации обоих вышеприведенных фрагментов кода является использование проекта Windows Application для настольных компьютеров. В Visual Studio .NET проекты для настольных компьютеров поддерживают графический способ создания и подключения всех поддерживаемых обработчиков прерываний. Сгенерированный при этом код вы далее можете скопировать и вставить в соответствующие части своего проекта .NET Compact Framework.

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

Пример: заполнение элемента управления TreeView данными по требованию

На рис. 11.3 представлен пример простого приложения с элементами управления TreeView (treeview1) и Button (button1). Щелчок на кнопке во время выполнения приложения устанавливает или сбрасывает состояние элемента управления TreeView. После установки состояния элемента управления TreeView щелчком на кнопке он предоставляет три узла верхнего уровня, которые можно динамически заполнять данными. Этими узлами являются узлы Neighbourhoods, Price и HouseType.

Рис. 11.3. Выполнение приложения, динамически заполняющего данными элемент управления TreeView, на эмуляторе Pocket PC

Чтобы сократить размер кода и не усложнять пример, в листинг 11.2 включен лишь код, обеспечивающий динамическое заполнение данными узла Neighbourhoods. Щелчки на других узлах будут приводить при первом щелчке к отображению окна сообщений MessageBox, информирующего о том, что для динамического заполнения данного узла данными вы должны добавить собственный код.

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

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

2. Добавьте в форму Form в окне конструктора элементы управления TreeView и Button.

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

4. Введите приведенный ниже код button1_Click, ответственный за заполнение данными элемента управления TreeView.

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

6. Вручную подключите обработчик событий для события BeforeExpand элемента управления TreeView, о чем говорилось в разделе выше.

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

Листинг 11.2. Динамическое заполнение данными элемента управления TreeView

//Фиктивный текст для размещения в заполнителях дочерних узлов

const string dummy_node = "_dummynode";

//Метка, которую мы будем использовать для обозначения узла

const string node_needToBePopulated = "_populateMe";

//Текст, который мы будем использовать для наших узлов высшего уровня

const string nodeText_Neighborhoods = "Neighborhoods";

const string nodeText_Prices = "Prices";

const string nodeText_HouseType = "HouseTypes";

//--------------------------------------------------------------------

//Обработчик события щелчка для кнопки

//

//Настраивает наш элемент управления TreeView для отображения процесса

//последовательного заполнения дерева

//--------------------------------------------------------------------

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

 TreeNode tnNewNode;

 //Отключить обновление интерфейса до тех пор, пока дерево

 //не будет заполнено

 treeView1.BeginUpdate;

 //Избавиться от устаревших данных

 treeView1.Nodes.Clear;

 //--------------------

 //Узел "Neighborhoods"

 //--------------------

 //Добавить узел "Neighborhoods" верхнего уровня.

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

Наследник и новый Новосиб

Тарс Элиан
7. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник и новый Новосиб

Сумеречный стрелок 8

Карелин Сергей Витальевич
8. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Сумеречный стрелок 8

Идеальный мир для Социопата 2

Сапфир Олег
2. Социопат
Фантастика:
боевая фантастика
рпг
6.11
рейтинг книги
Идеальный мир для Социопата 2

Краш-тест для майора

Рам Янка
3. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
эро литература
6.25
рейтинг книги
Краш-тест для майора

Идеальный мир для Социопата 6

Сапфир Олег
6. Социопат
Фантастика:
боевая фантастика
рпг
6.38
рейтинг книги
Идеальный мир для Социопата 6

Королевская Академия Магии. Неестественный Отбор

Самсонова Наталья
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Королевская Академия Магии. Неестественный Отбор

Ненаглядная жена его светлости

Зика Натаэль
Любовные романы:
любовно-фантастические романы
6.23
рейтинг книги
Ненаглядная жена его светлости

Кодекс Охотника. Книга V

Винокуров Юрий
5. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.50
рейтинг книги
Кодекс Охотника. Книга V

Его наследник

Безрукова Елена
1. Наследники Сильных
Любовные романы:
современные любовные романы
эро литература
5.87
рейтинг книги
Его наследник

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Бальмануг. (Не) Любовница 2

Лашина Полина
4. Мир Десяти
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Бальмануг. (Не) Любовница 2

Корпулентные достоинства, или Знатный переполох. Дилогия

Цвик Катерина Александровна
Фантастика:
юмористическая фантастика
7.53
рейтинг книги
Корпулентные достоинства, или Знатный переполох. Дилогия

Идеальный мир для Лекаря 3

Сапфир Олег
3. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 3

Возмездие

Злобин Михаил
4. О чем молчат могилы
Фантастика:
фэнтези
7.47
рейтинг книги
Возмездие