2013-05-06 49 views
0

我试图创建一个对话框,用户可以在某些按钮之间进行选择,但现在遇到的问题是,当用户关闭窗口时(不是选择按钮而是使用在右上角的x),应用程序显示消息,但之后它崩溃。有人知道我在这里做错了吗?错误时重新询问对话框

MainWindow.xaml.cs

public partial class MainWindow : Window 
{ 
    string[,] suppliers = new string[3,2] {{"xxx", "xxx"}, {"yyy", "yyy"}, {"zzz" , "zzz"}}; 


    public MainWindow() 
    { 
     InitializeComponent(); 

     ButtonPrompt buttonPrompt = new ButtonPrompt(suppliers, "Select supplier."); 

     while (buttonPrompt.ShowDialog() != true) 
     { 
      MessageBox.Show("Please choose one of the suppliers!"); 
     } 

    } 
} 

ButtonPrompt.xaml.cs:提前

public partial class ButtonPrompt : Window 
{ 
    public ButtonPrompt(string[,] buttons, string question) 
    { 
     InitializeComponent(); 

     buttonStack.Children.Clear(); 

     TextBlock questionBlock = new TextBlock(); 
     questionBlock.Text = question; 

     buttonStack.Children.Add(questionBlock); 

     for (int i = 0; i < buttons.GetLength(0); i++) 
     { 
      Button inputButton = new Button(); 

      inputButton.Name = buttons[i, 0]; 
      inputButton.Content = buttons[i, 1]; 

      inputButton.Width = 200; 
      inputButton.Height = 60; 

      inputButton.Click += inputButton_Click; 

      buttonStack.Children.Add(inputButton); 

      if (i == 0) 
      { 
       inputButton.Focus(); 
      } 
     } 


    } 

    private void inputButton_Click(object sender, RoutedEventArgs e) 
    { 
     Button inputButton = (Button)sender; 
     this.DialogResult = true; 
    } 

    private void Window_Closed(object sender, EventArgs e) 
    { 
     this.DialogResult = false; 
    } 
} 

谢谢!

回答

3

当窗口关闭时,buttonPrompt.ShowDialog()返回true。 有关的文档Window_Closed

一旦发生此事件,就无法阻止窗口关闭。

这意味着你不能设置DialogResult,因为它已经是true,你的while不起作用。

你有三种可能性:

  1. 覆盖的OnClosing方法就像How to override default window close operation?防止窗口从GUI按钮关闭。
  2. (我的最爱)重写OnClosing事件就像http://msdn.microsoft.com/it-it/library/system.windows.window.closing.aspx检查自己的条件和增加this.DialogResult = false
  3. 隐藏在XAML中设置WindowStyle=None

更新你关闭按钮对话窗口:在另一方面,把你的主窗口初始化检查一下,尝试使用Loaded处理程序,以确保你的Main组件在出现时没有麻烦。

+0

感谢您的回应,我现在正在使用您推荐的第二种可能性,它的功能就像一个魅力! ;) – Kryptoxx 2013-05-06 11:46:28

+0

@TomVandenbussche做得好! – 2013-05-06 11:52:48