我使用Coding4Fun工具包中的MessagePrompt
创建了自定义MessageBox。
运行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; }
}
}
答案 0 :(得分:1)
由于您正在通过单击事件显示MessageBox,因此您正在UI线程上运行,您不想冻结它。
一个选项是使ComplexMessage公开一个静态事件,它在messageprompt_Completed中触发。
然后在ResetData_Click中,在调用ComplexMessage.Show之前订阅事件,并在事件处理程序中,根据结果调用DataControl.DataFileReset,并取消订阅。
另一种方法是重新考虑使ComplexMessage的成员变为静态,而是将“Action&lt; bool&gt; callback”参数传递给Show方法,该方法存储在私有成员中,然后在messageprompt_Completed中调用回调。