启动自定义消息框时,我应该怎么做才能冻结父线程

本文关键字:冻结 线程 自定义消息 我应该 启动 | 更新日期: 2023-09-27 17:56:23

我使用Coding4Fun工具包中的MessagePrompt创建了自定义MessageBox。当我运行ResetData_Click时出现问题。我希望在启动ComplexMessage.Show内部的其余代码后ResetData_ClickComplexMessage打开时停止执行。正如发生的那样,情况完全不同。所有代码一次执行,用户在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; }
        }
    }

启动自定义消息框时,我应该怎么做才能冻结父线程

由于您正在显示来自单击事件的 MessageBox,因此您正在 UI 线程上运行,您不希望冻结该线程。

一种选择是让 ComplexMessage 公开静态事件,该事件在messageprompt_Completed中触发。

然后在调用 ComplexMessage.Show 之前订阅事件ResetData_Click并在事件处理程序中,根据结果调用 DataControl.DataFileReset,然后取消订阅。

另一种方法是重新考虑将 ComplexMessage 的成员设为静态,而是将"Action 回调"参数传递给 Show 方法,该方法存储在私有成员中,然后在 messageprompt_Completed 中调用回调。