В качестве побочного проекта Coding4Fun выпустил инструментарий для разработчиков Windows Phone 7. Это набор расширений (как и Silverlight Toolkit для Windows Phone 7 ) — ряд элементов управления и утилит, которые могут упростить процесс разработки и в некоторых случаях сэкономить разработчику дополнительные часы работы над пользовательскими элементами управления.
В этой статье я собираюсь поговорить о AboutPrompt, который представляет собой всплывающее окно с предварительно определенными полями для отображения информации о приложении и его разработчике. Если вы начнете работать с ним прямо из Visual Studio, вы увидите, что, поскольку он наследует от PopUp, а он наследует от Control , будет множество вариантов, которые поначалу будут сбивать с толку, и будет трудно понять, что именно можно использовать , Вы можете посмотреть на странице документации, чтобы увидеть, какие свойства доступны, и вы можете посмотреть на класс через Reflector:
Body, Footer, Title, VersionNumber и WaterMark — это свойства, которые устанавливают информацию, которая будет отображаться в AboutPrompt. Он не привязан только к текстовым полям и обладает широкими возможностями настройки. Если вы следуете шаблону по умолчанию, существует метод Show с тремя перегрузками:
Вызов Show по умолчанию покажет экземпляр AboutPrompt с установленными вручную свойствами — вам придется явно объявить значения. Например:
AboutPrompt prompt = new AboutPrompt();
prompt.Title = "About my app";
prompt.Body = "Hello! This is the information related to my application.";
prompt.VersionNumber = "Ultimate";
prompt.Show();
Вот как выглядит результат:
Есть одна проблема с этим изображением — строка about обрезана, и это не совсем то, что желательно. Что можно сделать, это использовать экранирование строк для разделения строк через \ n :
prompt.Body = "Hello! This is the \ninformation related to my application.";
Результат теперь выглядит намного лучше:
Исправлять подобные строки все еще сложно, и, в конце концов, разработчики, вероятно, захотят включить некоторые данные, отформатированные пользователем. Это где свойство Body выходит. На самом деле это не строка, а объект. Следовательно, он может содержать пользовательские элементы интерфейса. Например, предположим, что я хочу, чтобы во всплывающем окне была пользовательская кнопка, которая откроет веб-браузер и отправит меня в блог разработчика. Это можно сделать так:
private void button1_Click(object sender, RoutedEventArgs e)
{
Button b = new Button();
b.Height = 100;
b.Width = 100;
b.Content = "Go!";
b.Click += new RoutedEventHandler(b_Click);
AboutPrompt prompt = new AboutPrompt();
prompt.Title = "About my app";
prompt.Body = b;
prompt.VersionNumber = "Ultimate";
prompt.Show();
}
void b_Click(object sender, RoutedEventArgs e)
{
WebBrowserTask task = new WebBrowserTask();
task.URL = "http://dennisdel.com";
task.Show();
}
Вот что у меня есть:
Решением проблемы с разбиением строк в этом случае было бы использование элемента управления TextBlock и перенос содержимого:
TextBlock t = new TextBlock();
t.Text = "This is an informational dialog that shows some information about my application.";
t.TextWrapping = TextWrapping.Wrap;
AboutPrompt prompt = new AboutPrompt();
prompt.Title = "About my app";
prompt.Body = t;
prompt.VersionNumber = "Ultimate";
prompt.Show();
Текст будет автоматически перенесен, и вам не нужно будет разделять строки, если вы хотите отобразить подсказку с некоторой простой текстовой информацией.
Вторая перегрузка для метода Show принимает массив AboutPersonItem — набор экземпляров, которые описывают людей, вовлеченных в разработку и обслуживание приложения (или вы можете включить любого человека, которого вы хотите здесь). Еще раз, я использовал Reflector, чтобы посмотреть на свойства, которые я могу установить, поскольку AboutPersonItem также наследуется от Control, и в IntelliSense много шума.
Очевидно, что WebSiteDisplay является защищенным внутренним свойством, поэтому я должен исключить его из списка свойств, которые я могу установить в своем приложении. Он используется для правильного форматирования URL. И, кстати, если вы используете URL-адрес Twitter (например, http://twitter.com/DennisCode), он будет хранить строку с указателем @ profile. Я покажу это через минуту. Я создал тестовый массив для включения двух человек:
AboutPersonItem[] people = new AboutPersonItem[2];
people[0] = new AboutPersonItem() { AuthorName = "Dennis", EmailAddress = "[email protected]", Role = "Lead", WebSiteUrl = "http://dennisdel.com" };
people[1] = new AboutPersonItem() { AuthorName = "SomeoneElse", EmailAddress = "[email protected]", Role = "Assistant", WebSiteUrl = "http://www.twitter.com/DennisCode" };
Как только вы вызовете Show с этим массивом, переданным ему, свойство Body будет переопределено, и вы не сможете изменить его внутренне.
Страница теперь выглядит так:
Обратите внимание, как форматируется URL-адрес Twitter — после того, как вы нажмете на веб-сайт или указатель профиля в Twitter, он автоматически запустит новый WebBrowserTask, который откроет Internet Explorer с указанным URL-адресом. При нажатии на электронную почту запускается экземпляр EmailComposeTask.
Если существует только один автор приложения, вы можете упростить процесс и просто вызвать последнюю (третью) перегрузку для метода Show, например:
prompt.Show("Dennis", "DennisCode", "[email protected]", "dennisdel.com");
Здесь вы можете явно объявить свой дескриптор Twitter, и он будет использовать его для перехода к вашему потоку. Важно отметить, что все параметры (кроме имени) являются необязательными, поэтому, например, если у разработчика нет имени пользователя в Twitter, его можно пропустить.