对于 XAML Windows 商店应用程序,控件的默认外观定义在Common/StandardStyles.xaml
. 如果您曾经查看过该文件,您会注意到大量的参考资料,例如{StaticResource ApplicationForegroundThemeBrush}
. 看起来很有希望...
不幸的是,这些“主题画笔”并未在您的应用程序的任何地方定义,并且没有简单的方法可以为各个控件设置浅色或深色覆盖。然而,有一个答案。
幸运的是, Joe White 有一篇关于默认主题颜色的出色博客文章,我已将其转换为资源字典,您可以在此处找到。Dropbox 仅进行 xml 预览,因此您必须重命名文件。
但是,将这些资源复制到您的应用程序本身并没有帮助。要使用它们,您需要通过手术覆盖默认控件样式才能使用它们!
一种方法是创建一个新的资源字典,例如 at 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>
<!--
Styles that define common aspects of the platform look and feel
Required by Visual Studio project and item templates
-->
<ResourceDictionary Source="Common/ThemeColors.xaml"/>
<ResourceDictionary Source="Common/StandardStyles.xaml"/>
<ResourceDictionary Source="Common/CustomStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
请注意,我们的默认主题是Light
. 如果我们想制作一个Dark
-themed 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}"/>
当然,您也可以将此技术用于任何其他类型的控制。有点乏味,但结果是正确的,而且还没有尝试手动定义每种颜色那么糟糕!
这里没有魔法。我们只是定义了一些颜色并用我们复制粘贴和修改以使用我们的颜色的一种覆盖默认样式。