c# - 如何从 MahApps.Metro 将带有操作的按钮添加到 ShowInputAsync

标签 c# wpf xaml mahapps.metro

我在 wpf 应用程序中使用 MahApps Metro。我正在使用他们的 ShowInputAsync() Dialog

我想要保存一个目录,并且我想使用对话框来设置该目录。

所以,在我的 MainWindow.xaml.cs 中,我有类似的内容;

if(string.IsNullOrEmpty(userInputDirectory)) 
{
    userInputDirectory = await this.ShowInputAsync("Your Directory", "Set Your Directory");
}

效果很好,我喜欢对话框的外观,但我想添加一个浏览按钮,这样他们就不必记住目录位置,并且可以使用System.Windows.Forms.FolderBrowserDialog();

就像我说的,我喜欢它现在的样子,我不想删除其他两个按钮,或替换一个按钮,我只想添加一个。如有任何帮助,我们将不胜感激。

编辑1

我创建了一个新的用户控件,方法是右键单击项目 -> 添加... -> 用户控件 -> 用户控件 (WPF),并将其从 UserControl 更改为 对话框:BaseMetroDialog。我还添加了控件的 xmlns。我收到错误异常:无法创建“BaseMetroDialog”的实例。代码如下。

<Dialogs:BaseMetroDialog x:Class="testApp.CustomDialog"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
         xmlns:Dialogs="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro"          
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
    <Grid>

    </Grid>
</Dialogs:BaseMetroDialog>

我的.cs 文件

namespace testApp
{
/// <summary>
/// Interaction logic for CustomDialog.xaml
/// </summary>
    public partial class CustomDialog : CustomDialog
    {
        public CustomDialog()
        {
            InitializeComponent();
        }
    }
}

在尝试运行程序之前,我在 .xaml 文件中遇到的错误会显示在 xaml 窗口中。

InnerException: Exception has been thrown by the target of an invocation.
    StackTrace
         at System.RuntimeTypeHandle.CreateInstance(RuntimeType type,     Boolean publicOnly, Boolean noCheck, Boolean& canBeCached,     RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)

InnerException: Object reference not set to an instance of an object
    NullReferenceException: Object reference not set to an instance of an object.
        StackTrace
            at MahApps.Metro.Controls.Dialogs.BaseMetroDialog.HandleTheme()
            at MahApps.Metro.Controls.Dialogs.BaseMetroDialog.Initialize()
            at MahApps.Metro.Controls.Dialogs.BaseMetroDialog..ctor()

编辑2

如果其他人发现了这一点,并且遇到了同样的问题,MahApps.Metro 团队(这很棒,而且非常有帮助)直到 1.1.3 APHA 才添加 CustomDialog 修复,您应该而不是 BaseMetroDialog使用自定义对话框。

最佳答案

据我所知,metro 没有浏览器对话框。 为了实现这种行为,您需要创建自己的自定义 Metro 对话框。

为此,您必须创建一个 CustomDialog 类型的新用户控件(位于 MahApps.Metro.Controls.Dialogs 中)并自行实现预期行为。

在您的自定义对话框中,添加一个浏览器按钮,该按钮调用 System.Windows.Forms.FolderBrowserDialog();

获得自定义控件后,您可以使用以下代码显示它:

var browserDialog = new MyCustomDialog();
await this.ShowMetroDialogAsync(browserDialog);

关于c# - 如何从 MahApps.Metro 将带有操作的按钮添加到 ShowInputAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33311188/

相关文章:

c# - 在 XAML 中设置可为 null 的 TimeSpan

c# - 网格和列表框有一些我无法摆脱的边框

c# - 通过自定义属性 (json.net) 从序列化中排除属性

c# - 如何在实例化大量控件时不阻塞 UI

c# - ContextMenu 样式在不使用任何 Binding 的情况下产生奇怪的 Binding 错误

c# - 从 C# 代码生成包含触发器的 WPF 样式

c# - 继承与不同的实例?

c# - 是否可以在 C# 中实现作用域锁?

c# - .NET 中的动态 WSDL 位置

c# - Telerik RadDocument 表大小问题