1

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"

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

非常感谢,

电通

4

3 回答 3

4

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

于 2013-08-04T12:04:05.980 回答
2

有人可以告诉我怎么做

你不能用标准的消息框来做到这一点,即System.Windows.MessageBox.

替代方案

尽管您可以做的是定义一个custom message box(Windows 窗体),上面带有label您通过 event 更新的asynchronously。你用它来向用户显示倒计时。

于 2013-08-04T12:09:32.173 回答
1

这可以通过MessageBox扩展 WPF 工具包实现。它具有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++);
    }
}

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

于 2013-08-04T13:04:06.357 回答