如何在自定义对话框上获得对话结果
本文关键字:对话 结果 对话框 自定义 | 更新日期: 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;