将自定义对话框显示为模式对话框并获取结果(mahapps)

本文关键字:对话框 结果 mahapps 获取 模式 自定义 显示 | 更新日期: 2023-09-27 18:35:43

我有一个类,它使用自定义内容创建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);
    }

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

将自定义对话框显示为模式对话框并获取结果(mahapps)

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

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

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

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

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

    var result = await parent.ShowMetroDialogAsync((BaseMetroDialog)dialog);
    

不要忘记在方法结束时return result;

  1. 更改方法定义以返回此结果,如下所示:

    internal async Task<MessageDialogResult> fnShowDialog(MainWindow parent)
    

这是完整的方法:

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 == ...)
    {...}