自定义消息框建议

时间:2010-08-03 19:58:11

标签: wpf messagebox

我正在使用Window作为我的自定义消息框,其中包含几个控件,根据调用的构造函数显示/填充文本。

我有一个已定义的事件,通过原始类订阅,一旦点击该按钮就会触发。

但是我无法看到如何有效地使用它,最好是我想返回一个bool,无论是或否点击,但显然我的代码将继续执行,因此该子方法被单击按钮点击。下面是一些示例代码,可以使问题更加清晰。

消息框窗口

public partial class CustomMessageBox : Window
    {

        public delegate void MessageBoxHandler(object sender, EventArgs e);
        public event MessageBoxHandler MessageBoxEvent;

        public CustomMessageBox()
        {
            InitializeComponent();
        }

        public CustomMessageBox(string message)
        {
            InitializeComponent();
            this.txtdescription.Text = message;
        }

        public CustomMessageBox(string message, string title, string firstBtnText)
        {
            InitializeComponent();
            this.lbltitle.Content = title;
            this.txtdescription.Text = message;
            this.btnstart.Content = firstBtnText;
        }

    }

    public static class MessageBoxButtonClick
    {

        public static bool Yes { get; set; }
        public static bool No { get; set; }
        public static bool Cancel { get; set; }
    }

实例化MessageBox窗口的窗口

private void StartProcess_Click(object sender, System.Windows.RoutedEventArgs e)
        {

            foreach (var result in results)
            {
                if(result.ToBeProcessed)
                    _validResults.Add(new ToBeProcessed(result.Uri, result.Links));

            }
            _msgbox = new CustomMessageBox("Each Uri's backlinks will now be collected from Yahoo and filtered, finally each link will be visited and parsed. The operation is undertaken in this manner to avoid temporary IP Blocks from Yahoo's servers.", "Just a FYI", "OK");
            _msgbox.MessageBoxEvent += (MessageBoxHandler);

            if (_msgBoxProceed)
            {
                _msgbox.Close();
                Yahoo yahoo = new Yahoo();

                yahoo.Status.Sending += (StatusChange);

                //What I'd like to happen here is the code simply stop, like it does when calling a messagebox is winforms
                //e.g. 
                // if(ProceedClicked == true)
                // do stuff

               // yahoo.ScrapeYahoo(_validResults[Cycle].Uri, _validResults[Cycle].LinkNumber);

                //Cycle++;
            }
            else
            {
                _msgbox.Close();
            }

        }

private void MessageBoxHandler(object sender, EventArgs e)
        {
            if (MessageBoxButtonClick.Yes)
            {
                ProceedClicked = true;
            }
            else
            {
                ProceedClicked = false;
            }
        }

希望这足够清楚,我不能放任何执行代码,即在我的应用程序中多次使用它来调用某个方法。

1 个答案:

答案 0 :(得分:1)

很难理解问题到底是什么。你在这里写的代码,似乎没有任何调用,实际上会显示CustomMessageBoxWindow。

但我会抓住这个...... 首先,我是否正确地猜测在您的主窗口中您希望代码在if(_msgBoxProceed)处等待,直到用户实际按下CustomMessageBoxWindow中的按钮(当前它只显示消息框并继续执行下一个语句) ?

如果是这样,那么我猜你正在使用Show()方法显示你的消息框窗口。请改用ShowDialog()。这将导致代码执行停止,直到消息框关闭。

如果您不想使用模态对话框,则有两个选项。要么使用线程同步对象(例如AutoResetEvent),要么在消息框关闭时设置新事件,并在已关闭的事件处理程序中继续执行代码(在StartProcess_Click中,最后一行是对_msgBox.Show()的调用以及来自if(_msgBoxProceed)将在闭合事件处理程序中。)