You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

WPF中如何为控件设置Fluent主题背景并适配Application.ThemeMode主题切换?

WPF中如何为控件设置Fluent主题背景并适配Application.ThemeMode主题切换?

嗨,刚好我最近在.NET 9里折腾过Fluent主题的这个场景,踩过和你一样的坑,给你几个靠谱的解决方案:

1. 最省心的XAML方案:直接用Fluent主题内置的动态资源

这是最简单的方法,纯XAML就能搞定,完全不需要后台代码。你只需要给你的Border(或者其他控件)的Background绑定Fluent主题专门维护的动态资源:

<Border Background="{DynamicResource WindowBackgroundBrush}" />

这个WindowBackgroundBrush是Fluent主题内置的,会自动跟着Application.ThemeMode的切换同步更新颜色——不管是从亮切暗还是暗切亮,它都会和窗口、Grid这些默认控件一样,带着平滑的过渡动画自动变化。

为什么你之前用SystemColors.WindowBrushKey不行?

其实是因为当前.NET 9的实验性ThemeMode功能,还没把SystemColors系列的资源和Fluent主题的亮暗切换做绑定。那些SystemColors的资源还是老的静态逻辑,不会随ThemeMode变化,所以你看到的一直是白色,切暗模式也没反应。而Fluent主题自己维护了一套动态资源字典,专门对应ThemeMode的切换,上面的WindowBackgroundBrush就是其中之一。

2. 进阶:根据控件场景选择合适的Fluent背景资源

如果你需要的不是窗口级的背景,而是更贴合Fluent设计规范的其他背景(比如卡片、面板的背景),Fluent主题还提供了一系列预定义的动态资源,比如:

  • CardBackgroundFillColorDefaultBrush:卡片组件的默认背景色
  • SurfaceBackgroundFillColorDefaultBrush:普通表面容器的背景色
  • ListBoxItemBackgroundBrush:列表项的背景色
    这些资源同样是动态的,会自动跟随ThemeMode切换,你可以根据控件的使用场景选对应的键就行。

3. 代码后台的备选方案(如果XAML场景受限)

如果因为某些原因你需要在后台代码里设置,也很简单,直接获取Fluent的动态资源就行:

// 假设你的Border控件名叫myBorder
myBorder.Background = (Brush)Application.Current.FindResource("WindowBackgroundBrush");

因为是动态资源,后续ThemeMode切换时,WPF会自动帮你更新这个Brush的颜色,不需要你手动监听ThemeMode的变化事件,省心得很。

额外注意点:确保Fluent主题是应用的默认主题

虽然你说其他控件(Grid、Window)都正常,但还是提一句:要确保你的App.xaml里已经正确应用了Fluent主题,新建的.NET 9 WPF项目默认会自动加,但如果手动改过资源字典的话,要确认有这段:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <FluentTheme />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

亲测这个方法完全符合你的需求,我自己的项目里用Border做容器时就是这么搞的,切主题的时候丝滑得很~

火山引擎 最新活动