我正在使用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公司
答案 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++);
}
}
这种方法的好处是您不需要再编写另一个消息框。