代码之家  ›  专栏  ›  技术社区  ›  JibW

带有弹出窗口的Windows phone7自定义消息框

  •  1
  • JibW  · 技术社区  · 13 年前

    在我的应用程序中,我使用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();
                    }
            };
    

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

    2 回复  |  直到 13 年前
        1
  •  2
  •   Negative Eddy    13 年前

    之所以会发生这种情况,是因为所有这些都发生在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。但是你确定要弹出窗口先消失吗?如果用户单击消息框上的“取消”怎么办?通常,消息框直接显示在调用它的内容的顶部,而不会替换它。

        2
  •  1
  •   Andrew Leader Lukkha Coder    13 年前

    我只是在打字负艾迪写的东西。

    使用Dispatcher.BeginInvoke将起作用!我测试过了,效果很好。我没有足够的代表来评论他的言论。