0

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

主窗口.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;
    }
}

提前致谢!

4

1 回答 1

3

buttonPrompt.ShowDialog()Window 关闭时返回 true 。文档说Window_Closed

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

这意味着您不能设置,DialogResult因为它已经是真的并且您的 while 不起作用。

你有三种可能:

  1. 覆盖如何覆盖默认窗口关闭操作OnClosing中的方法?以防止从 GUI 按钮关闭窗口。
  2. (我最喜欢的)覆盖OnClosing事件,如http://msdn.microsoft.com/it-it/library/system.windows.window.closing.aspx检查您自己的条件并添加this.DialogResult = false
  3. 从 XAML 设置中隐藏对话框窗口的关闭按钮WindowStyle=None

更新:另一方面,将您的 while 检查退出主窗口初始化,尝试使用 Loaded 处理程序,以确保您的 Main 组件在出现时没有问题。

于 2013-05-06T10:10:58.193 回答