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

Я создал свой собственный 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 messageresult;

        public static void Show(string message, string title, bool vibrate)
        {
            if (!(!(messageprompt == null) && 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 messageresult; }
        }
    }

1 Ответ

1 голос
/ 11 мая 2011

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

Один из вариантов - заставить ComplexMessage предоставлять статическое событие, которое вызывается в messageprompt_Completed.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...