所以我通常做的就是显示一个对话框并在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按钮,可以清除用户名和密码字段。
有没有办法做到这一点?
答案 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;