Что я должен сделать, чтобы заморозить родительский поток при запуске пользовательского MessageBox?

#c# #windows-phone-7

#c# #windows-phone-7

Вопрос:

Я создал свой пользовательский MessageBox с помощью MessagePrompt инструментария Coding4Fun. Проблема возникает при запуске ResetData_Click . Я ожидал, что после запуска ComplexMessage.Show остальной код внутри ResetData_Click перестанет выполняться, пока ComplexMessage открыт. Как произошло, это совершенно другое. Весь код выполняется одновременно, и не имеет значения, что пользователь выберет в ComplexMessage , потому что

 if (ComplexMessage.Result)...
  

уже выполнено.
Что я должен сделать, чтобы мой ComplexMessage действовал как System.Windos.MessageBox ? Это означает, что при MessageBox вызове родительский поток ожидает решения пользователя.

         private void ResetData_Click(object sender, RoutedEventArgs e)
        {
            ComplexMessage.Show("You are about to delete all data", "Are you sure?", true);

            if (ComplexMessage.Result)
            {
                DataControl.DataFileReset();
            }
        }

 public class ComplexMessage
    {
        private static MessagePrompt messageprompt;
        private static bool messageresu<

        public static void Show(string message, string title, bool vibrate)
        {
            if (!(!(messageprompt == null) amp;amp; messageprompt.IsOpen))
            {
                messageprompt = new MessagePrompt
                {
                    Title = title,
                    Message = message
                };

                messageprompt.Completed  = new EventHandler<PopUpEventArgs<string, PopUpResult>>(messageprompt_Completed);
                messageprompt.IsCancelVisible = true;
                messageprompt.Show();
                if (vibrate) { Tools.VibrateMessage(); }
            }
        }

        static void messageprompt_Completed(object sender, PopUpEventArgs<string, PopUpResult> e)
        {
            if (!e.PopUpResult.Equals(PopUpResult.Cancelled))
            {
                messageresult = true;
            }
            else
            {
                messageresult = false;
            }
            ((MessagePrompt)sender).Completed -= messageprompt_Completed;
        }

        public static bool Result
        {
            get { return messageresu< }
        }
    }
  

Комментарии:

1. является ли lunched новым термином для сборки мусора? LOL 😉

2. ладно, сегодня мне нужно было хорошенько посмеяться. Спасибо 🙂

Ответ №1:

Поскольку вы отображаете MessageBox из события click, вы работаете в потоке пользовательского интерфейса, который вы не хотите замораживать.

Один из вариантов — заставить ComplexMessage отображать статическое событие, которое оно запускает в messageprompt_Completed.

Затем в ResetData_Click подписаться на событие перед вызовом ComplexMessage.Показать и в обработчике события, в зависимости от результата, вызвать DataControl .Повторно установите файл данных и отпишитесь.

Альтернативой является переосмысление того, чтобы сделать элементы ComplexMessage статическими, и вместо этого передать методу Show параметр «Action<bool> callback», который вы сохраняете в закрытом элементе, а затем вызвать обратный вызов в messageprompt_Completed .

Комментарии:

1. Вы правы, я заморозил поток пользовательского интерфейса, а также мое сложное сообщение 🙂 Спасибо за ваши предложения. Я попытаюсь сделать это и поделиться результатами. Если вы не возражаете, я оставлю этот вопрос открытым на некоторое время. Возможно, у кого-нибудь найдется какое-нибудь блестящее решение для моей проблемы.