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

时间:2014-09-03 20:45:21

标签: c# wpf dialog wait

我决定在WPF中创建自己的对话框窗口。我让它使用框架并导航到框架中的WPF页面以获得我之前制作的相应对话窗口。尝试返回值时出现问题。例如,如果我有'ok'和'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;
    }

会发生什么事情会立即返回布尔值,当然这总是假的。我需要它等到页面中按下“确定”或“取消”,然后继续返回它的值。

以下是页面中的代码。

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),那么冻结GUI。 由于我没有接受过C#的正式培训,所以我很可能会向后做事。感谢您对本网站上第一篇文章的回复。

2 个答案:

答案 0 :(得分:3)

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

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);
    }

答案 1 :(得分:0)

您可以在对话框delegate中创建Window,并使用创建和显示它的相同方法附加处理程序。然后,您可以在单击Button时调用委托,并调用启动类。然后,您将知道该值并能够关闭Window

如果您不了解delegate,那么您一定要阅读MSDN上的Delegates (C# Programming Guide)页面,以帮助您了解此解决方案。你可以这样做:

在对话框中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媒体资源的需求并不大,您可以轻松地在true中返回falseQuestionResponse delegate。一旦调用它,处理程序就会得到响应。

关于你没有使用不同Window的评论,它对delegate没有什么影响,它的工作方式也是一样的。当没有涉及UI时,您可以使用它们。