我有一个输入对话框的示例代码,可以在Mahapps Metro中完美运行,只需要将文本字段更改为密码字段。实际对话框位于此cs文件和xaml文件中。
这听起来很简单,我所要做的就是用密码框修改xaml文件,但保持其他所有内容相同。唯一的问题是,要激活对话框,在DialogManager中调用一个名为ShowInputAsync()的方法,该方法实例化InputDialog。问题是,构造函数是内部的。
namespace MahApps.Metro.Controls.Dialogs
{
public partial class InputDialog : BaseMetroDialog
{
internal InputDialog(MetroWindow parentWindow, MetroDialogSettings settings)
: base(parentWindow, settings)
{
InitializeComponent();
}
DialogManager中的代码
using MahApps.Metro.Controls;
using MahApps.Metro.Controls.Dialogs;
namespace order
{
public static class DialogManager
{
public static Task<string> ShowInputAsync(this MetroWindow window, string title, string message, MetroDialogSettings settings = null)
{
window.Dispatcher.VerifyAccess();
return HandleOverlayOnShow(settings, window).ContinueWith(z =>
{
return (Task<string>)window.Dispatcher.Invoke(new Func<Task<string>>(() =>
{
if (settings == null)
settings = window.MetroDialogOptions;
//create the dialog control
InputDialog dialog = new InputDialog(window, settings); // this is where I need my own dialog created (xaml/cs files)
有没有办法重新使用代码,或者我是否必须从头开始编写所有这些管道?
答案 0 :(得分:1)
这是一个在Mahapps中实现基本登录的简单功能:
private async void ShowLoginDialog(object sender, RoutedEventArgs e)
{
LoginDialogData result = await this.ShowLoginAsync("Authentication", "Enter your credentials", new LoginDialogSettings { ColorScheme = this.MetroDialogOptions.ColorScheme, InitialUsername = "MahApps"});
if (result == null)
{
//User pressed cancel
}
else
{
MessageDialogResult messageResult = await this.ShowMessageAsync("Authentication Information", String.Format("Username: {0}\nPassword: {1}", result.Username, result.Password));
}
}
可以在MahApps Github中找到。如果你想简化就可以这样调用
ShowLoginDialog(null,null);
答案 1 :(得分:0)
由于它是内部的,如果它位于同一名称空间中,您始终可以访问类中的构造函数。虽然这通常是一种糟糕的编程习惯,但您可以从位于MahApps.Metro.Controls.Dialogs中的新类继承该类:
namespace MahApps.Metro.Controls.Dialogs
{
public class MyCustomDialog : InputDialog
{
public MyCustomDialog(MetroWindow parentWindow, MetroDialogSettings settings) : base(parentWindow, settings)
{
// Your custom code here
}
}
}
这只是一个想法。希望它有所帮助!
编辑:刚刚在这里找到了这个:How to add a passwordbox to dialog in Mahapp也许会有所帮助。
答案 2 :(得分:0)
我需要一个自定义输入对话框。所以我创建了一个从BaseMetroDialog继承的CustomInputDialog类。
我使用此代码调用方法:
public async Task<string> ShowCustomDialog(string message, string title)
{
var metroDialogSettings = new MetroDialogSettings()
{
AffirmativeButtonText = "OK",
NegativeButtonText = "CANCEL",
AnimateHide = true,
AnimateShow = true,
ColorScheme = MetroDialogColorScheme.Accented,
};
var dialog = new CustomInputDialog(View, metroDialogSettings)
{
Message = message,
Title = title,
Input = metroDialogSettings.DefaultText
};
return await InvokeOnCurrentDispatcher(async () =>
{
await View.ShowMetroDialogAsync(dialog, metroDialogSettings);
await dialog.WaitForButtonPressAsync().ContinueWith((m) =>
{
InvokeOnCurrentDispatcher(() => View.HideMetroDialogAsync(dialog));
});
return dialog.Input;
});
}
您可以添加密码框或您选择显示的任何视图。 您可以查看Mahapps.Metro的InputDialog中的代码,例如
与Message,Title和Input类似,是CustomInputDialog的依赖属性。这在我的最后工作。