【问题标题】:What is the simplest way to apply themeing应用主题的最简单方法是什么
【发布时间】:2017-09-12 07:35:43
【问题描述】:

假设我有一个 ResourceDictionary:

更新:

<SolidColorBrush x:Key="AquaBrush" Color="#257D8E"/> 

<SolidColorBrush x:Key="GreenBrush" Color="Green"/>

假设这是我的应用程序:

我有一个包含项目(Aqua、Green 和 Gray)的组合框当我选择 Aqua 按钮时,它应该显示如下: 我要设置的 Button 和其他控件也应该将其背景更新为 aqua。

如何将 SplitView 、 Button 、其他控件的背景绑定到一个属性,当我选择“aqua”时,它将使用“AquaBrush”,当我选择“Green”时,它将使用“GreenBrush” ?

谢谢。

【问题讨论】:

    标签: c# uwp themes resourcedictionary


    【解决方案1】:

    由于您在 XAML 中定义了 SolidColorBrush 资源,您可以从后面的代码中执行此操作,以便在运行时根据条件更改背景颜色:

    if(Some Condition){
        relativePanelName.Background = (SolidColorBrush)Resources["NavPaneBackgroundBrushBlue"];
    }else {
        relativePanelName.Background = (SolidColorBrush)Resources["NavPaneBackgroundBrushGreen"];
    }
    

    希望这会有所帮助..!


    编辑:

    另外,你不仅可以定义自己的静态资源,还可以使用系统的theme resources

    例如,您可以像这样访问系统的强调色:

    C#

    var color = (Color)this.Resources["SystemAccentColor"];
    

    Xaml

    <Grid.Background>
       <SolidColorBrush Color="{StaticResource SystemAccentColor}"/>
    </Grid.Background>
    

    编辑 2: 由于问题已被更改并以更好的方式构建,因此很明显您想了解 Applicationwide Theme-ing 。 您可以通过多种方式获得应用程序范围的主题,所以这里有一个:

    • 在您的 App.Xaml 中定义一个应用程序资源,以便它是 在您的应用程序中可用。

    • 现在这些资源将在所有页面中都可用。您可以像这样访问它们:

    这样您将拥有应用范围的主题。

    您还可以从后面的代码中访问应用程序资源:

    gridName.Background=new SolidColorBrush((Color)Application.Current.Resources["ColorThree"]);
    

    编辑 3:

    在你的 app.xaml 中:

    <ResourceDictionary>
                <Color x:Key="ThemeColor">#f4425f</Color>
                <SolidColorBrush x:Key="UserAccentBrush" Color="{StaticResource ThemeColor}"/>
    </ResourceDictionary>
    

    点击按钮后,只需更改“UserAccentBrush”的颜色,它就会反映在所有使用画笔的控件中。

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var brush = (SolidColorBrush)Application.Current.Resources["UserAccentBrush"];
    
                if (cb.SelectedIndex != -1)
                {
                    switch (cb.SelectedIndex)
                    {
                        case 0:
                            brush.Color = Color.FromArgb(255, 242, 101, 34);
                            break;
    
                        case 1:
                            brush.Color = Color.FromArgb(255, 232, 10, 90);
                            break;
                    }
                }
    }
    

    请注意,我是直接使用 application.current.resources,你可能需要稍微修改一下代码..

    如果您需要保存此颜色并在下次用户打开应用程序时应用它,您需要将其保存到应用程序设置(或您可能维护的任何设置文件)并在加载应用程序时应用颜色更改代码。 .!

    【讨论】:

    • 有更通用的方法来做同样的事情,这将严格基于颜色。我会考虑使用资源字典和应用主题
    • 好的,但是对于我的场景,有没有更好或正确的方法?
    • 由于 NicoTing 已经在他的资源字典中定义了资源,我提供了一个在运行时应用资源的解决方案..我已经编辑了我的答案以添加更多关于相同的信息..
    • 更新问题
    • 更新了我的答案..解释了如何定义和访问应用程序范围的资源..
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    相关资源
    最近更新 更多