C#WPF暂停处理,直到按下按钮
本文关键字:按钮 暂停 处理 C#WPF | 更新日期: 2023-09-27 18:20:37
我决定在WPF中创建自己的对话框窗口。我让它使用框架工作,并导航到框架中的WPF页面,以获得我以前制作的适当对话框窗口。当试图返回一个值时,问题就出现了。例如,如果我有"ok"answers"cancel",我希望在框中显示的页面上按"ok"或"cancel"时返回布尔值。
//This is what I'm using to display the dialog window frame.
public bool DisplayQuestion(string subject, string message)
{
AlertIsUp = true;
var questionPage = new QuestionPage(AlertFrame, subject, message);
AlertFrame.Navigate(questionPage);
if (MainFrame.Content != null && MainFrame.Content.ToString() == "System.Windows.Controls.WebBrowser")
{
MainFrame.Visibility = System.Windows.Visibility.Hidden;
}
//I need it to wait until a button on the dialog frame is pressed before continuing.
return QuestionResponse;
}
发生的情况是,is将立即返回布尔值,当然该值始终为false。我需要它等待,直到页面中按下"确定"或"取消",然后继续返回它的值。
这是页面中的代码。
Frame AlertFrame { get; set; }
public bool AlertIsUp { get; set; }
public bool QuestionResponse { get; set; }
public QuestionPage(Frame alertFrame, string subject, string message)
{
InitializeComponent();
theMesssage.Content = message;
subjectLabel.Content = subject;
AlertFrame = alertFrame;
AlertIsUp = MainWindow.AlertIsUp;
QuestionResponse = MainWindow.QuestionResponse;
}
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
AlertFrame.Content = null;
AlertIsUp = false;
QuestionResponse = false;
}
private void OkButton_Click(object sender, RoutedEventArgs e)
{
AlertFrame.Content = null;
AlertIsUp = false;
QuestionResponse = true;
}
当然,如果我只是添加While(AlertIsUp),那么if会冻结GUI。由于我没有接受过任何正式的C#培训,我很可能在做一些倒退的事情。感谢你对我在这个网站上的第一篇帖子的友好回复。
我实际上在这里找到了这个问题的解决方案:
http://www.codeproject.com/Articles/36516/WPF-Modal-Dialog
解决方案最终放置了一小段代码:
while (AlertIsActive)
{
if (this.Dispatcher.HasShutdownStarted ||
this.Dispatcher.HasShutdownFinished)
{
break;
}
this.Dispatcher.Invoke(
DispatcherPriority.Background,
new ThreadStart(delegate { }));
Thread.Sleep(20);
}
您可以在对话框Window
中创建一个delegate
,并从创建和显示它的相同方法附加一个处理程序。然后,您可以在单击Button
时调用委托,启动类将被调用。然后,您将知道该值,并能够关闭Window
。
如果您不了解delegate
,那么您一定应该阅读MSDN上的Delegates(C#编程指南)页面,以帮助您理解此解决方案。你可以这样做:
在对话框Window
:中
public void delegate Response(bool response);
public Response OnButtonClick { get; set; }
然后在启动对话框Window
:的代码中
DialogWindow dialogWindow = new DialogWindow();
dialogWindow.OnButtonClick += OnButtonClick;
dialogWindow.Show();
public void OnButtonClick(bool response)
{
if (response) { /* Ok */ }
else { /* Cancel */ }
}
更新>>>
很抱歉忘记向你展示关键部分。单击Button
时,对话框Window
调用delegate
:
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
AlertFrame.Content = null;
AlertIsUp = false;
QuestionResponse = false;
if (OnButtonClick != null) OnButtonClick(QuestionResponse);
}
private void OkButton_Click(object sender, RoutedEventArgs e)
{
AlertFrame.Content = null;
AlertIsUp = false;
QuestionResponse = true;
if (OnButtonClick != null) OnButtonClick(QuestionResponse);
}
当然,您实际上并不需要QuestionResponse
属性,您可以在QuestionResponse delegate
中轻松返回true
或false
。一旦调用了它,处理程序就会得到响应。
关于你关于你没有使用不同的Window
s的评论,它与delegate
s没有什么区别,它的工作原理是一样的。您可以在根本不涉及UI的情况下使用它们。