Статьи

Доставить сообщение. Использование MessageBox в Windows Phone 7.

Так сколько раз вы использовали окно сообщения, когда разрабатывали для настольной платформы? Ответ, вероятно, довольно часто. Окно сообщения — это очень неинвазивный способ сообщить пользователю, что что-то требует его внимания, и, возможно, попросить о выборе действия. Windows Phone 7 также поддерживает окна сообщений, хотя двумя разными способами. Эти два способа привязаны к двум отдельным фреймворкам, которые были разработаны как основа для SDK — XNA и Silverlight.

MessageBox в Silverlight

Если вы решите разработать приложение Silverlight для Windows Phone 7, у вас будет опция usign MessageBox — стандартный класс, который позволяет отображать сообщение пользователю. Один интересный факт — этот класс MessageBox весьма ограничен, когда дело доходит до настройки пользователя. Он вызывается напрямую через MessageBox.Show (), как это было сделано в настольном приложении.

В Silverlight для WP7 есть две перегрузки:

Первая перегрузка позволит разработчику отобразить простое сообщение с кнопкой «ОК» — настолько простое, насколько это возможно, и оно идеально подходит для ситуаций, когда пользователю не нужно принимать решение.

Так что, если бы я хотел что-то вроде:

MessageBox.Show ("Hello!");

Я получу сообщение, которое будет отображаться так:

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

Он предлагает немного больше настроек, позволяя разработчику устанавливать заголовок и фактически выбирать, нужен ли набор кнопок OK или OKCancel.

Например:

MessageBox.Show("The file will be saved here.", "File Save", MessageBoxButton.OKCancel);

Это сгенерирует следующий вывод:

Можно отслеживать ответ от MessageBox через MessageBoxResult:

MessageBoxResult m = MessageBox.Show("The file will be saved here.", "File Save", MessageBoxButton.OKCancel); 

Когда вы захотите проверить результат, вам будет предложено перечисление возможных значений, и на самом деле это больше, чем вы ожидаете:

Только OK и Отмена будут работать, если проверено против. Другие параметры будут просто игнорироваться, поскольку нет доступных кнопок «Да» или «Нет». Теперь вы можете подумать — а как насчет None? Это также не вариант — когда пользователь закрывает MessageBox нестандартным способом (например, нажатием кнопки «Назад»), результатом, который автоматически передается в качестве ответа, является MessageBoxResult.Cancel, даже если кнопка «Отмена» не нажата ,

MessageBox в XNA

Да, вы все равно можете использовать это в Silverlight, если добавляете ссылки на Microsoft.Xna.Framework и Microsoft.Xna. Framework.GamerServices. Это гораздо более настраиваемое окно сообщения по сравнению с тем, что предлагается в Silverlight из коробки, главным образом потому, что оно может иметь кнопки, помеченные разработчиком, и различать типы звуков оповещений.

Он вызывается асинхронно через Guide.BeginShowMessageBox (). Этот метод также имеет две перегрузки:

Единственное различие между ними состоит в том, что во второй перегрузке вы можете указать PlayerIndex, который принимает только PlayerIndex.One как для Windows, так и для Windows Phone, поэтому я вместо этого буду использовать первую перегрузку, чтобы избежать добавления и дополнительного значения enum.

Посмотрите на кнопки IEnumerable <string> . Этот параметр позволяет разработчику передавать коллекцию кнопок. Однако важно отметить, что максимальное количество разрешенных кнопок здесь равно 2, поэтому, если будет передана большая коллекция, будет сгенерировано исключение.

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

MessageBoxIcon на самом деле не является иконкой (да, я знаю — название так говорит). На Windows Phone 7 он определит короткий звук, который будет сопровождать сообщение. И здесь у вас есть несколько вариантов:

Поскольку это текстовая статья, я не могу показать вам, как звучит каждая из этих статей. Все что я могу сказать — каждый из них звучит по-своему.

Теперь пришло время поработать с обратным вызовом — он будет запущен, когда MessageBox закрыт, и внутри него вы должны вызвать Guide.EndShowMessageBox (), чтобы получить ответ.

Итак, давайте посмотрим на пример вызова:

 Guide.BeginShowMessageBox("Version of Windows", "Pick a version of Windows.",
new List<string> { "Vista", "Seven" }, 0, MessageBoxIcon.Error,
asyncResult =>
{
int? returned = Guide.EndShowMessageBox(asyncResult);
Debug.WriteLine(returned.ToString());
}, null);

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

Когда я запускаю этот кусок кода, я получаю это:

Помните, что не только этот тип MessageBox является более настраиваемым, но он также вызывается асинхронно, поэтому после его показа он не будет блокировать выполнение основного приложения (в отличие от MessageBox в Silverlight).