4

根据 MSDN,设置应用程序主题的标准方法是设置RequestedTheme="Dark"RequestedTheme="Light"在顶层Application实例上。

这适用于简单的应用程序,但很多时候我发现自己想要更改单个页面甚至单个控件的主题(例如,在同一个应用程序中,浅色主题的文本编辑页面与深色主题的图像查看器)。

XAML 控件具有 10 或 100 种视觉状态和颜色定义,并且手动设置它们中的每一个都是乏味的,而且很难 100% 正确!

有没有一种简单的方法可以在单个控件上设置深色或浅色主题?

4

4 回答 4

5

对于 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}"/>

当然,您也可以将此技术用于任何其他类型的控制。有点乏味,但结果是正确的,而且还没有尝试手动定义每种颜色那么糟糕!

这里没有魔法。我们只是定义了一些颜色并用我们复制粘贴和修改以使用我们的颜色的一种覆盖默认样式。

于 2013-02-22T20:18:26.757 回答
5

一个似乎没有被提及的解决方案就是在单个控件元素上使用RequestedTheme="Dark"RequestedTheme="Light" 。

我为一个需要将一些 appbarbuttons 设置为深色设置(即白色前景)的应用程序这样做 - 因为 Foreground 属性没有将圆圈和字形本身都设置为白色:

<AppBarButton Label="Reload all articles" RequestedTheme="Dark" >

这样,我只是强制控件使用我决定的主题。

于 2013-12-19T21:45:32.363 回答
1

在 Common 文件夹中,您有一个 StandardStyles.xaml 文件。

在这里,您可以找到 Metro 应用程序的所有默认标准样式。您需要取消注释要使用的样式并将其作为静态资源添加到控件中。

于 2013-02-22T20:08:20.730 回答
0

在设计我的应用程序“通讯录”时,我也遇到了同样的问题,因为我也想要在 Dark & Light 主题之间进行更改。对于您的问题:“如何在 C#/XAML Windows 应用商店(Metro UI)应用程序中混合浅色和深色主题? ”,我有一个极好的解决方案。

  • 我制作了两个具有相同代码和相同内容的页面。我将这两个页面一个接一个地添加,然后我在这两种主题 Light & Dark 之间进行了动态更改。我为用户提供了一个选项,无论他们想要深色布局还是浅色布局,并且根据用户的选择,我已经应用了主题。在这种情况下,我成功了。

第二种解决方案:

  • 如果您想要应用程序的动态外观,那么您必须创建自己的静态布局类型,然后您可以将该静态资源绑定到您想要应用这种样式的页面。

如果您在此处找不到答案,请原谅,但我认为它可能会帮助您在 win 8 Metro 应用程序中动态更改“暗”和“亮”主题设置。

于 2013-02-23T10:38:14.267 回答