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#培训,我很可能在做一些倒退的事情。感谢你对我在这个网站上的第一篇帖子的友好回复。

C#WPF暂停处理,直到按下按钮

我实际上在这里找到了这个问题的解决方案:

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中轻松返回truefalse。一旦调用了它,处理程序就会得到响应。

关于你关于你没有使用不同的Window s的评论,它与delegate s没有什么区别,它的工作原理是一样的。您可以在根本不涉及UI的情况下使用它们。