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