1

在我的应用程序中,我使用 Popup 创建了一个自定义消息框(具有不同的背景颜色)。它有一个按钮,我已经实现了按钮单击事件。

在单击按钮时,它有一个消息框,并根据“确定”或“取消”从那里开始执行操作。

问题是在我单击弹出窗口(自定义消息框)中的按钮后,消息框加载,但弹出窗口(自定义消息框)仍然出现在后台。我需要自定义弹出窗口完全关闭并执行操作。因此,我已将其用作popup.IsOpen = false;按钮单击中的第一条语句,但它仍然出现在后台,直到它完成整个按钮单击事件。我搜索了其他属性,但没有找到任何工作。

以下是代码

        Popup popup = new Popup();
        popup.Height = 300;
        popup.Width = 480;
        popup.VerticalOffset = 100;
        CustomMessageBox control = new CustomMessageBox();
        popup.Child = control;

        popup.IsOpen = true;
        this.IsEnabled = false;

        control.OK_BTN.Click += (s, args) =>
        {
            popup.IsOpen = false;
            this.IsEnabled = true;

            MessageBoxResult result = MessageBox.Show("Do you want to reset the settings ?", "Settings", MessageBoxButton.OKCancel);

                if (result == MessageBoxResult.OK)
                {
                    changeSettings();
                }
        };

任何实现这一目标的建议都将受到高度赞赏。谢谢...!!!

4

2 回答 2

2

发生这种情况的原因是因为所有这些都发生在 UI 线程上,该线程在您返回之前一直被阻塞。在您的按钮处理程序返回之前,不会对 UI 进行任何更新。

如果您真的希望弹出窗口首先消失,您需要执行类似的操作

        control.OK_BTN.Click += (s, args) =>
        {
            popup.IsOpen = false;
            this.IsEnabled = true;

            Dispatcher.BeginInvoke(() =>
                {
                    MessageBoxResult result = MessageBox.Show("Do you want to reset the settings ?", "Settings", MessageBoxButton.OKCancel);

                    if (result == MessageBoxResult.OK)
                    {
                        changeSettings();
                    }
                });
        };

这将在您的按钮处理程序返回后强制打开 MessageBox。但是您确定要让弹出窗口先消失吗?如果用户在消息框上单击取消怎么办?通常,消息框直接出现在调用它的任何内容之上,并且不会替换它。

于 2012-08-06T20:59:47.087 回答
1

我只是在输入 Negative Eddy 写的内容。

使用 Dispatcher.BeginInvoke 将起作用!我测试了它,完美运行。我没有足够的代表来评论他的显然。

于 2012-08-06T21:05:51.283 回答