WinUI3:动态内容UserControl如何在代码后台实现ThemeResource主题切换?
解决WinUI3后台代码等效{ThemeResource}的问题
问题根源
你当前代码的两个核心问题:
- 笔误:
Resources["BorderBrush1"]应为Resources["BorderBrush"],但即使修正,直接通过Resources索引获取资源也不会考虑当前UserControl的RequestedTheme上下文,无法匹配XAML中{ThemeResource}的动态主题切换效果。 - 未监听主题变化的自动更新逻辑,仅手动在按钮点击时调用更新,场景覆盖不全。
解决方案
使用FrameworkElement.FindResource方法替代直接索引Resources,该方法会根据当前元素的RequestedTheme上下文查找对应主题字典中的资源,完全等效于XAML中的{ThemeResource}语法;同时监听RequestedThemeChanged事件,确保主题变化时自动更新动态元素的资源。
修改后的C#代码
using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Input; using Microsoft.UI.Xaml.Media; namespace TestWinUI3App { public sealed partial class UserControl1 : UserControl { public UserControl1() { InitializeComponent(); UpdateBrush(); // 监听主题变更事件,自动触发资源更新 RequestedThemeChanged += UserControl1_RequestedThemeChanged; } private void UserControl1_RequestedThemeChanged(FrameworkElement sender, object args) { UpdateBrush(); } private void Button_Tapped(object sender, TappedRoutedEventArgs e) { RequestedTheme = RequestedTheme == ElementTheme.Dark ? ElementTheme.Light : ElementTheme.Dark; } private void UpdateBrush() { // 通过FindResource获取当前主题对应的资源,等效于{ThemeResource} if (FindResource("BorderBrush") is SolidColorBrush brush) { Border.BorderBrush = brush; } } } }
动态生成元素的适配
如果是动态创建的元素,同样可以用FindResource设置资源:
// 动态创建Border var dynamicBorder = new Border { BorderThickness = new Thickness(1) }; if (FindResource("BorderBrush") is SolidColorBrush brush) { dynamicBorder.BorderBrush = brush; } // 将元素添加到布局容器 stackPanel.Children.Add(dynamicBorder);
截图强制Light主题的补充
当需要截图时,只需将UserControl的RequestedTheme设置为ElementTheme.Light,RequestedThemeChanged事件会自动触发UpdateBrush,所有动态元素都会切换到Light主题下的资源,满足截图需求。
内容的提问来源于stack exchange,提问作者Siyh
相关产品推荐
相关产品推荐

