如何在不需要Metro风格的主题的情况下显示对话框框?

5
我可以帮助您翻译如下内容:

我想展示一个类似于Metro风格的对话框:

public async void Button_Click(object sender, RoutedEventArgs e)
{
   var metroWindow = (Application.Current.MainWindow as MetroWindow);
   await metroWindow.ShowMessageAsync("Title", "Body");
}

enter image description here

然而,它一直抛出以下错误:

未经处理的类型“System.NullReferenceException”的异常发生在 mscorlib.dll 中

带有堆栈跟踪:

at MahApps.Metro.Controls.Dialogs.BaseMetroDialog.HandleTheme()

at MahApps.Metro.Controls.Dialogs.BaseMetroDialog.Initialize()

at MahApps.Metro.Controls.Dialogs.BaseMetroDialog..ctor(MetroWindow owningWindow, MetroDialogSettings settings)

...

at System.Threading.ThreadHelper.ThreadStart()

所以经过很多调试后,我意识到需要在我的 App.xaml 资源中包含一个重音符号,以给它一个颜色方案。

<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Cobalt.xaml" /> 

然而,我已经在不包括它的情况下构建了我的程序,并且包含它会破坏所有样式。此外,总共没有很多重音符号请看这里,我找不到适合我的方案的重音符号。
我一直试图直接为ShowMessageAsync方法提供自己的颜色方案,例如使用以下命令:
metroWindow.MetroDialogOptions.ColorScheme = MetroDialogOptions.ColorScheme 
// MetroDialogColorScheme.Theme 
// MetroDialogColorScheme.Accented 
// MetroDialogColorScheme.Inverted;

但是同样的错误仍然出现。有没有办法绕过这个问题?我该如何让对话框使用自己的样式?
编辑
实际上,我已经在这里下载了文件:https://github.com/MahApps/MahApps.Metro/blob/master/MahApps.Metro/Styles/Accents/Cobalt.xaml 并且在ResourceDirectory.MergedDictionaries中替换了。
  <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Cobalt.xaml" />

With

  <ResourceDictionary Source="Cobalt.xaml" />

这已经足以破坏函数了。我可以看到主题仍在生效,但当我尝试触发对话框时,窗口会淡出,但对话框不会出现,我需要重新启动程序。发生了什么事情?

2个回答

3
你应该看一下 ThemeManager 。在应用程序启动时设置AppStyle,如下所示:
ThemeManager.ChangeAppStyle(this, ThemeManager.Accents.First(x => x.Name == "Red"), ThemeManager.DetectAppStyle().Item1);

下面是一个可用主题的示例:

在此输入图片描述

如果要使用自己的样式,可以像这样添加一个强调:

ThemeManager.AddAccent("XpertdocBlue", new Uri("XpertdocBlue.xaml", UriKind.Relative));

尝试添加一个 ResourceDictionary

这是我的代码:

<controls:MetroWindow.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml"/>
            <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml"/>
            <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml"/>
            <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml"/>
            <ResourceDictionary Source="pack://application:,,,/Xpertdoc.PortalWordAddIn.Views;component/Resources/Icons.xaml"/>
            <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
            <ResourceDictionary Source="XpertdocBlue.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</controls:MetroWindow.Resources>

这是我的自定义强调样式(XpertdocBlue.xaml):

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Color x:Key="HighlightColor">#FF2B579A</Color>

    <Color x:Key="AccentColor">#FF2B579A</Color>
    <!--60%-->
    <Color x:Key="AccentColor2">#CC2B579A</Color>
    <!--40%-->
    <Color x:Key="AccentColor3">#992B579A</Color>
    <!--20%-->
    <Color x:Key="AccentColor4">#662B579A</Color>

    <!-- re-set brushes too -->
    <SolidColorBrush x:Key="HighlightBrush" Color="{StaticResource HighlightColor}" />
    <SolidColorBrush x:Key="AccentColorBrush" Color="{StaticResource AccentColor}"/>
    <SolidColorBrush x:Key="AccentColorBrush2" Color="{StaticResource AccentColor2}"/>
    <SolidColorBrush x:Key="AccentColorBrush3" Color="{StaticResource AccentColor3}"/>
    <SolidColorBrush x:Key="AccentColorBrush4" Color="{StaticResource AccentColor4}"/>

    <SolidColorBrush x:Key="WindowTitleColorBrush" Color="{StaticResource AccentColor}" />

    <SolidColorBrush x:Key="AccentSelectedColorBrush" Color="White" />

    <LinearGradientBrush x:Key="ProgressBrush" EndPoint="0.001,0.5" StartPoint="1.002,0.5">
        <GradientStop Color="{StaticResource HighlightColor}" Offset="0" />
        <GradientStop Color="{StaticResource AccentColor3}" Offset="1" />
    </LinearGradientBrush>

    <SolidColorBrush x:Key="CheckmarkFill" Color="{StaticResource AccentColor}" />
    <SolidColorBrush x:Key="RightArrowFill" Color="{StaticResource AccentColor}" />

    <Color x:Key="IdealForegroundColor">White</Color>
    <SolidColorBrush x:Key="IdealForegroundColorBrush" Color="{StaticResource IdealForegroundColor}"/>

</ResourceDictionary>

谢谢,我认为这让我走上了正确的轨道。但是我该如何添加自定义主题呢?因为 ThemeManager.DetectAppStyle()ThemeManager.DetectAppStyle(Application.Current) 都返回 null - Charles Clayton
1
谢谢 Cedric。我用来帮助我处理主题的另一个技巧是指定单个控件的主题,而不是整个窗口。例如,我想要我的数据网格使用与窗口其余部分不同的主题。因此,我使用了以下代码 <DataGrid.Resources> <ResourceDictionary Source="pack:/.../Accents/BaseLight.xaml" /> </DataGrid.Resources> - Charles Clayton

1
MessageDialog md=new MessageDialog("my message");
await md.showAsync();

如果您想创建自定义消息对话框,那么您需要创建自己的自定义控件。您可以在需要时轻松地向自定义对话框添加样式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接