День первый. Продвинутый MessageBox: MessageBoxEx

Вступление

В Silverlight-проектах существует класс MessageBox для вывода системных сообщений. Его возможности существенно ограничены. А в XNA Framework есть похожий класс BeginShowMessageBox, обладающий гораздо большей функциональности. Попробуем взять класс из XNA Framework и внедрить его в свой Silverlight-проект.

Стандартный MessageBox

Для начала посмотрим, как работает стандартный MessageBox и разберем его недостатки.

Основные недостатки системного диалогового окна с сообщением:

  • Вызов окна сопровождается вибрацией (не отключается)
  • Вызов окна сопровождается звуком (не отключается)
  • Есть только два варианта кнопок (Одна кнопка OK или две кнопки OK и Cancel). Текст кнопок не редактируется

Стандартный вызов диалогового окна выглядит следующим образом.


private void butSimpleMessageBox_Click(object sender, RoutedEventArgs e)
{
   if(MessageBox.Show("Вы любите котов?", "Вопрос", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
   {
        textBlockAnswer.Text = "Я вас тоже люблю";
   }
   else
   {
       textBlockAnswer.Text = "Кто не любит котов — собаки";
   }
}

MessageBox

Продвинутый MessageBox

Как видите, диалоговое окно очень сильно ограничивает разработчика - самая главная беда: никак не поменять текст на кнопках. Но, оказывается в XNA Framework есть собственный класс Guide.BeginShowMessageBox, который лишен подобных недостатков. Класс позволяет задать одну или две кнопки и использовать свой текст для кнопок. А для отключения звука и вибрации нужно выбрать вариант MessageBoxIcon.None в параметре, который отвечает за вывод значка в окне с сообщением.

Чтобы использовать класс Guide.BeginShowMessageBox в Silverlight-проекте, нужно сначала установить ссылку на пространство имен Microsoft.Xna.Framework.GamerServices. Для удобства создадим новый класс-обертку MessageBoxEx, в котором будет выполняться вся работа.


namespace MessageBoxExtendedDemo
{

    public enum MessageBoxExResult
    {
        Button1,
        Button2,
        None
    }

    public class MessageBoxEx
    {

        /// <summary>
        /// Displays a message box that contains the specified text, title bar caption, and two response buttons.
        /// </summary>
        /// <param name="messageBoxText">The message to display.</param>
        /// <param name="caption">The title of the message box.</param>
        /// <param name="button1">The title of the first button.</param>
        /// <param name="button2">The title of the second button. Pass null if you only want one button.</param>
        /// <returns>A value that indicates the user's response to the message.</returns>
        public static MessageBoxExResult Show(string messageBoxText, string caption, string button1, string button2)
        {
            int? returned = null;
            using (var mre = new System.Threading.ManualResetEvent(false))
            {
                string[] buttons;
                if (button2 == null)
                    buttons = new string[] { button1 };
                else
                    buttons = new string[] { button1, button2 };

                Microsoft.Xna.Framework.GamerServices.Guide.BeginShowMessageBox(
                    caption,
                    messageBoxText,
                    buttons,
                    0, // кнопка, которая получит фокус
                    Microsoft.Xna.Framework.GamerServices.MessageBoxIcon.None,
                    result =>
                    {
                        returned = Microsoft.Xna.Framework.GamerServices.Guide.EndShowMessageBox(result);
                        mre.Set(); // Убираем блокировку
                    }, null);

                mre.WaitOne();
            }

            if (!returned.HasValue)
                return MessageBoxExResult.None;
            else if (returned == 0)
                return MessageBoxExResult.Button1;
            else if (returned == 1)
                return MessageBoxExResult.Button2;
            else
                return MessageBoxExResult.None;
        }
    }
}

Теперь для вызова продвинутого окна с сообщением достаточно написать несколько строчек кода:


private void butMessageBoxEx_Click(object sender, RoutedEventArgs e)
{
    if (MessageBoxEx.Show("Выберите варианты", "Кто сказал мяу", "Мяу", "Гав") == 0)
    {
        textBlockAnswer.Text = "Кошка";
    }
    else
    {
        textBlockAnswer.Text = "Собака";
    }
}

MessageBoxEx

Скачать исходник

Идея статьи

The Moth - Guide.BeginShowMessageBox wrapper

Реклама