如何在自定义对话框中获取对话结果

时间:2014-05-05 14:41:30

标签: c# wpf

所以我通常做的就是显示一个对话框并在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中创建自己的对话框。问题是我不太确定如何返回对话结果。它只是一个简单的框,带有一个okay按钮,可以清除用户名和密码字段。

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

我在SO上发现了另一个问题(这里是Where is Button.DialogResult in WPF?

 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中输入“Ok”按钮

yourNameSpaceForTheButtonHelperClass:ButtonHelper.DialogResult="True"

答案 1 :(得分:0)

使用MVVM模式,您可以通过在您的控件正在使用的ViewModel上公开DialogResult来完成此操作。我强烈建议为此创建一个接口,因此无论实际视图模型的类型如何,您都可以通过强制转换到界面来检索结果。

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;