对于 XAML Windows Store 应用,控件的默认外观是在 Common/StandardStyles.xaml 文件中定义的。如果您曾经看过那个文件,您会注意到大量类似 {StaticResource ApplicationForegroundThemeBrush} 的引用。看起来很有前途...
不幸的是,这些“主题刷子”在应用程序中没有定义,也没有简单的方法为单个控件设置浅色或深色覆盖。然而,有一个答案。
幸运的是,Joe White 在默认主题颜色上写了一篇
绝佳的博客文章,我已将其转化为资源字典,您可以在
这里找到。Dropbox 只提供 XML 预览,所以您需要将文件重命名。
然而,仅复制这些资源到您的应用程序是无法帮助您的。要使用它们,您需要手动覆盖默认控件样式以使用它们!
一种方法是创建一个新的资源字典,例如在 Common/CustomStyles.xaml 中,并将其合并到应用程序的资源中,如下所示:
<Application
x:Class="My.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
RequestedTheme="Light">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Common/ThemeColors.xaml"/>
<ResourceDictionary Source="Common/StandardStyles.xaml"/>
<ResourceDictionary Source="Common/CustomStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
请注意,我们的默认主题是Light
。如果我们想要制作一个Dark
主题的TextBlock
,让我们从StandardStyles.xaml
中复制视觉样式,并将其添加到我们的CustomStyles.xaml
中并进行一些更改。
<Style x:Key="BasicRichTextStyleDark" TargetType="RichTextBlock">
<Setter Property="Foreground" Value="{StaticResource ApplicationForegroundThemeBrushDark}"/>
<Setter Property="FontSize" Value="{StaticResource ControlContentThemeFontSize}"/>
<Setter Property="FontFamily" Value="{StaticResource ContentControlThemeFontFamily}"/>
<Setter Property="TextTrimming" Value="WordEllipsis"/>
<Setter Property="TextWrapping" Value="Wrap"/>
<Setter Property="Typography.StylisticSet20" Value="True"/>
<Setter Property="Typography.DiscretionaryLigatures" Value="True"/>
<Setter Property="Typography.CaseSensitiveForms" Value="True"/>
</Style>
请注意,我们已将“Dark”附加到样式名称和主题画笔定义中!您可以通过在CustomStyles.xaml文件中查找并替换“ThemeBrush}”=>“ThemeBrushDark}”来实现此操作。
现在,您可以像这样创建一个深色主题的文本块:
<TextBlock Style="{StaticResource BasicRichTextStyleDark}"/>
当然,您也可以将此技术应用于任何其他类型的控件。虽然有些繁琐,但结果是正确的,并且远不如手动定义每种颜色那么糟糕!
这里没有什么魔法。我们只是定义了一些颜色,并用一个我们复制并修改以使用我们的颜色的默认样式来覆盖它。