将CustomDialog显示为模态对话框并获取结果(mahapps)

时间:2014-12-31 14:07:50

标签: c# modal-dialog customdialog mahapps.metro

我有一个用自定义内容创建SimpleDialog(现在CustomDialog)的类。到目前为止,我成功地展示了它。关闭它。但是如何将其返回到父窗口?就像ShowDialog方法一样?到目前为止的代码是,

    internal void fnShowDialog(MainWindow parent)
    {
        SimpleDialog dialog = new SimpleDialog();
        StackPanel panel = new StackPanel();

        Label block = new Label() { Content = "custom message" };
        TextBlock block1 = new TextBlock() { Text = "custom message", FontSize = 22 };
        Button button = new Button() { Content = "close" };
        button.Click += (s, e) =>
            {
                parent.HideMetroDialogAsync((BaseMetroDialog)dialog);
            };
        panel.Children.Add(block);
        panel.Children.Add(block1);
        panel.Children.Add(button);
        dialog.DialogBody = panel;            

        parent.ShowMetroDialogAsync((BaseMetroDialog)dialog);
    }

我需要知道此对话框的结果,以便进一步进行相应的处理。

3 个答案:

答案 0 :(得分:0)

我建议您在Click事件处理程序中获取对话框的结果,与您调用HideMetroDialogAsync的位置相同。

答案 1 :(得分:0)

每个表单都有DialogResult属性。您可以在某个事件上设置它们,然后在关闭表单后在对话框对象中检查它们的枚举值。

BaseMetroDialog可以具有父级可见的DialogResult属性。

答案 2 :(得分:0)

这是一个简单的异步过程:

  1. 您应该使用await关键字来获得结果:

    var result = await parent.ShowMetroDialogAsync((BaseMetroDialog)dialog);
    
  2. 在方法结束时不要忘记return result;

    1. 更改方法定义以返回此结果:

      internal async Task<MessageDialogResult> fnShowDialog(MainWindow parent)
      
    2. 这是完整的方法:

      internal async Task<MessageDialogResult> fnShowDialog(MainWindow parent)
      {
          SimpleDialog dialog = new SimpleDialog();
          StackPanel panel = new StackPanel();
      
          Label block = new Label() { Content = "custom message" };
          TextBlock block1 = new TextBlock() { Text = "custom message", FontSize = 22 };
          Button button = new Button() { Content = "close" };
          button.Click += (s, e) =>
              {
                  parent.HideMetroDialogAsync((BaseMetroDialog)dialog);
              };
          panel.Children.Add(block);
          panel.Children.Add(block1);
          panel.Children.Add(button);
          dialog.DialogBody = panel;            
      
          var result = await parent.ShowMetroDialogAsync((BaseMetroDialog)dialog);
          return result;
      }
      
      1. 您可以将此方法与await一起使用,如下所示:

        var result = awiat fnShowDialog(parent);
        if(result == ...)
        {...}