【问题标题】:WPF Style/Themes: placeholderWPF 样式/主题:占位符
【发布时间】:2015-05-21 06:52:22
【问题描述】:

我有一个 WPF 项目,它有 2 个主题,深色和浅色。 主题放置在我的调试中的单独文件夹中。

DarkTheme.xaml

<Style x:Key="Handle" TargetType="Grid">
    <Setter Property="OverridesDefaultStyle" Value="True" />
    <Setter Property="Background" Value="#FF323232" />
</Style>

<Style x:Key="Label" TargetType="Label">
    <Setter Property="Foreground" Value="#FFC8C8C8" />
</Style>

LightTheme.xaml

<Style x:Key="Handle" TargetType="Grid">
    <Setter Property="OverridesDefaultStyle" Value="True" />
    <Setter Property="Background" Value="#FFFAFAFA" />
</Style>

<Style x:Key="Label" TargetType="Label">
    <Setter Property="Foreground" Value="#FF323232" />
</Style>

然后我将主题作为 DynamicResource 应用到标签

<Label Content="TestLabel" Style="{DynamicResource Label}" Foreground="#FF323232"/>

这就是我加载它们的方式

private void ThemeChanged(object sender, SelectionChangedEventArgs e)
    {
        if (combo.SelectedIndex == -1) return;

        foreach (var command in Directory.GetFiles(((ThemeData)combo.SelectedValue).ThemePath).Where(x => x.EndsWith(".xaml")))
        {
            var stream = new FileStream(command, FileMode.Open);

            foreach (DictionaryEntry dictionaryEntry in (ResourceDictionary)XamlReader.Load(stream))
            {
                Application.Current.Resources[dictionaryEntry.Key] = dictionaryEntry.Value;
            }
        }
    }

问题

更改主题(运行时)时标签前景不会改变,除非我将前景保留为空。但我不能在设计中将所有内容都留空(因为我无法使用空白屏幕)

那么如何让主题覆盖样式呢?或者我可以制作一个占位符样式?

【问题讨论】:

  • 顶,真的需要这个回答

标签: c# wpf xaml styles themes


【解决方案1】:

我不知道你在做什么来加载主题资源,但你需要做的是卸载以前的主题(从应用程序资源中删除它)然后加载新的主题。如果您将它们同时加载到资源中,则控件无法确定应用哪一个。

编辑: 由于您将键合并到应用程序资源中,然后在主题更改时替换它们(这不起作用),因此更改现有资源的值一定不足以触发更新。

在我自己的个人 WPF 主题库中,当我加载一个主题时,我将主题生成的字典添加到应用程序的 Resources.MergedDictionaries 集合中。我还保留了对字典的引用,以便以后卸载主题时,可以将其从合并的字典集合中删除。这样做可以确保完全卸载所有主题资源。您可能需要考虑做类似的事情。

附:您正在创建一个文件流并且从不关闭它。这将导致该文件在应用程序关闭之前无法访问。您应该将该代码块包装在 using statement 中。

【讨论】:

    猜你喜欢
    • 2014-11-24
    • 1970-01-01
    • 2020-02-26
    • 2017-04-07
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    相关资源
    最近更新 更多