如何在自定义对话框上获得对话结果

本文关键字:对话 结果 对话框 自定义 | 更新日期: 2023-09-27 18:01:49

在c#中,我通常是这样显示对话框并获得结果的

    MessageBoxResult result = MessageBox.Show("Wrong username or password", "Invalid details", MessageBoxButton.OK, MessageBoxImage.Hand);
        string clear = "";
        if (result == MessageBoxResult.OK)
        {
            username.Text = clear;
            password.Password = clear;
        }

然而,我一直讨厌这个标准的外观,所以我决定在wpf中制作我自己的对话框。问题是我不太确定如何用它返回对话结果。它只是一个带有ok按钮的简单框,用来清除用户名和密码字段。

有什么办法可以做到吗?

如何在自定义对话框上获得对话结果

我在SO上的另一个问题上发现了这一点(这里哪里是按钮)。)

 public class ButtonHelper
    {
        // Boilerplate code to register attached property "bool? DialogResult"
        public static bool? GetDialogResult(DependencyObject obj) 
        { 
            return (bool?)obj.GetValue(DialogResultProperty);
        }
        public static void SetDialogResult(DependencyObject obj, bool? value)
        {
            obj.SetValue(DialogResultProperty, value);
        }
        public static readonly DependencyProperty DialogResultProperty = 
            DependencyProperty.RegisterAttached(
            "DialogResult", typeof(bool?), typeof(ButtonHelper), new UIPropertyMetadata
        {
            PropertyChangedCallback = (obj, e) =>
            {
                // Implementation of DialogResult functionality
                var button = obj as Button;
                if (button == null)
                    throw new InvalidOperationException("Can only use ButtonHelper.DialogResult on a Button control");
                button.Click += (sender, e2) =>
                {
                    Window.GetWindow(button).DialogResult = GetDialogResult(button);
                };
            }
        });
    }

然后在确定按钮的xaml中

yourNameSpaceForTheButtonHelperClass:ButtonHelper.DialogResult="True"

使用MVVM模式,您可以通过在控件正在使用的ViewModel上公开一个dialgresult来实现这一点。我强烈建议为此创建一个接口,这样无论实际视图模型的类型如何,您都可以通过转换到接口来检索结果。

var control = new MyControl();
control.ShowDialog();  // Assuming your control is a Window
                       // - Otherwise, you'll have to wrap it in a window and event-bind to close it
result = (control.DataContext as IResultDialogVM).Result;

或者,如果您喜欢显式地设置视图模型

var vm = new MyViewModel(question);
new MyControl { DataContext = vm }.ShowDialog();
result = vm.Result;