【问题标题】:Adding custom styles to Mahapps.Metro existing ones将自定义样式添加到 Mahapps.Metro 现有样式
【发布时间】:2015-03-18 14:21:24
【问题描述】:

我使用MahApps.Metro。在设置指南中,它告诉您在 App.xaml 中包含一些代码。所以我做到了。

现在我希望能够向其添加我自己的样式。例如,这包括默认情况下具有边框的所有窗口。

但这不起作用。不应用边框。我知道在不使用 MahApps.Metro 时如何设置样式,但有了它,我就无法同时工作。

这里有什么问题?

<Application x:Class="ProjectName.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="Windows/MainWindow.xaml">
    <Application.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/Blue.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
                <!-- This is what I added -->
                <ResourceDictionary xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro">
                    <Style TargetType="Controls:MetroWindow">
                        <Setter Property="BorderThickness" Value="1" />
                        <Setter Property="BorderBrush" Value="{DynamicResource AccentColorBrush}" />
                    </Style>
                </ResourceDictionary>
                <!-------------------------->
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

【问题讨论】:

    标签: c# wpf mahapps.metro


    【解决方案1】:

    你忘记用BasedOn继承样式了:

    <ResourceDictionary xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro">
        <Style TargetType="Controls:MetroWindow"
               BasedOn="{StaticResource {x:Type Controls:MetroWindow}}">
            <Setter Property="BorderThickness" Value="1" />
            <Setter Property="BorderBrush" Value="{DynamicResource AccentColorBrush}" />
        </Style>
    </ResourceDictionary>
    

    编辑

    经过测试,我的第一个答案并不正确。您必须设置一个 x:Key 并在每个 MetroWindow xaml 中使用此密钥。

    <Style x:Key="CustomGlobalMetroWindow"
            TargetType="{x:Type Controls:MetroWindow}"
            BasedOn="{StaticResource {x:Type Controls:MetroWindow}}">
        <Setter Property="BorderThickness"
                Value="1" />
        <Setter Property="BorderBrush"
                Value="Purple" />
    </Style>
    

    用法

    <Controls:MetroWindow x:Class="Demo"
                          Style="{DynamicResource CustomGlobalMetroWindow}" />
    

    希望有帮助!

    【讨论】:

    • 嗯,x:Key 这个东西不是很方便,但总比重复代码好。谢谢 & +1 :)
    【解决方案2】:

    我最终这样做了:

    更不容易出错,更适合懒惰

    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            ThemeManager.ChangeAppStyle(this,
                                        ThemeManager.GetAccent("Amber"),
                                        ThemeManager.GetAppTheme("BaseDark"));
    
            var allTypes = typeof(App).Assembly.GetTypes();
            var filteredTypes = allTypes.Where(d =>
                typeof(MetroWindow).IsAssignableFrom(d)
                && typeof(MetroWindow) != d
                && !d.IsAbstract).ToList();
    
            foreach (var type in filteredTypes)
            {
                var defaultStyle = this.Resources["MetroWindowDefault"];
                this.Resources.Add(type, defaultStyle);
            }
    
            base.OnStartup(e);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 2016-03-14
      • 2021-09-25
      • 1970-01-01
      相关资源
      最近更新 更多