我决定在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#的正式培训,所以我很可能会向后做事。感谢您对本网站上第一篇文章的回复。
答案 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
中返回false
或QuestionResponse delegate
。一旦调用它,处理程序就会得到响应。
关于你没有使用不同Window
的评论,它对delegate
没有什么影响,它的工作方式也是一样的。当没有涉及UI时,您可以使用它们。