使用System.Windows.MessageBox更新MessageBoxText运行时?

时间:2013-08-04 12:00:28

标签: c# wpf messagebox

我正在使用System.Windows.MessageBox向用户显示该消息,但我希望在显示该Messagebox之后更新该文本。

在我的示例中,我想向MessageBox显示可在运行时更改的内容,如下所示:

"The system will be restarted in 5 seconds"
"The system will be restarted in 4 seconds"
"The system will be restarted in 3 seconds"
"The system will be restarted in 2 seconds"
"The system will be restarted in 1 second"
"The system will be restarted in 0 second"

有人可以告诉我该怎么做吗?

非常感谢,

T& T公司

3 个答案:

答案 0 :(得分:4)

我认为使用另一个窗口而不是MessageBox更容易。然后关闭不需要的功能(调整大小,关闭按钮),使其成为模态,设置定时器事件处理等。

答案 1 :(得分:2)

  

有人可以告诉我该怎么做

您无法使用标准消息框即System.Windows.MessageBox执行此操作。

<强>替代

虽然您可以做的是定义一个custom message box(一个窗口表单),其中包含label,您可以通过事件asynchronously进行更新。然后用它来向用户显示倒计时。

答案 2 :(得分:1)

使用Extended WPF Toolkit中的MessageBox可以实现这一点。 它有Text依赖属性,可以是数据绑定,但不幸的是,MessageBox初始化被隐藏,而解决方案包含多行:

首先,我们需要我们的MessageBox祖先,因为我们将调用受保护的InitializeMessageBox方法(以应用标准消息框设置)。然后,我们需要进行Show重载,这会将绑定应用于Text

class MyMessageBox : Xceed.Wpf.Toolkit.MessageBox
{
    public static MessageBoxResult Show(object dataContext)
    {
        var messageBox = new MyMessageBox();

        messageBox.InitializeMessageBox(null, null, "Hello", MessageBoxButton.OKCancel, MessageBoxImage.Question, MessageBoxResult.Cancel);
        messageBox.SetBinding(MyMessageBox.TextProperty, new Binding
        {
            Path = new PropertyPath("Text"),
            Source = dataContext
        });
        messageBox.ShowDialog();
        return messageBox.MessageBoxResult;
    }
}

接下来,我们需要一个数据上下文:

sealed class MyDataContext : INotifyPropertyChanged
{
    public string Text
    {
        get { return text; }
        set
        {
            if (text != value)
            {
                text = value;
                OnPropertyChanged("Text");
            }
        }
    }
    private string text;

    private void OnPropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

代码,它将更改消息框中的文本:

public partial class MainWindow : Window
{
    private readonly MyDataContext dataContext;
    private readonly DispatcherTimer timer;
    private int secondsElapsed;

    public MainWindow()
    {
        InitializeComponent();

        dataContext = new MyDataContext();
        timer = new DispatcherTimer(TimeSpan.FromSeconds(1), DispatcherPriority.ApplicationIdle, 
            TimerElapsed, Dispatcher.CurrentDispatcher);
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        secondsElapsed = 0;
        timer.Start();

        MyMessageBox.Show(dataContext);

        timer.Stop();
    }

    private void TimerElapsed(object sender, EventArgs e)
    {
        dataContext.Text = string.Format("Elapsed {0} seconds.", secondsElapsed++);
    }
}

这种方法的好处是您不需要再编写另一个消息框。