达到下面的效果其实非常简单
首先,建立一个对象,包含一个bool字段,指示是否显示 暗色主题
private void SwitchThemeButton_Click(object sender, RoutedEventArgs e) { MySettings = new UserSetting { IsDarkTheme = !MySettings.IsDarkTheme }; }
UserSetting对象是我用来存储用户设置的,IsDarkTheme绑定前台 请求的主题
忘了说一句,UWP主题和DataContext数据上下文一样是向后拓展的,即子元素默认和父元素使用的主题一致(如果子元素没有设置RequestTheme的话).所以绑定到Page或者Frame上,内部的元素均能受益.
<Frame x:Name="Frame1" RequestedTheme="{x:Bind MySettings.IsDarkTheme,Mode=TwoWay,Converter={StaticResource ElementThemeConverter}}" Grid.Column="0"> </Frame>
绑定的时候需要是ElementTheme或AppTheme的枚举类型,需要进行转换,Converter用法这里不说了,Converter如下:
public class ElementThemeConverter : IValueConverter { object IValueConverter.Convert(object value, Type targetType, object parameter, string language) { if ((bool)value) { return ElementTheme.Dark; } else { return ElementTheme.Light; } } object IValueConverter.ConvertBack(object value, Type targetType, object parameter, string language) { bool result = false; switch (value) { case ElementTheme.Dark: result = true; break; case ElementTheme.Light: result = false; break; } return result; } }
上面的Convert back实际上是没用的,如绑定Page则更改ElementTheme为AppTheme类型.
如此完成了Theme的后台绑定.
元素如果要相应绑定的主题变化,只需要更改Xaml即可.将元素绑定Theme资源主题(系统自带),即可跟随主题变换颜色.
<Setter Property="Foreground" Value="{ThemeResource ApplicationForegroundThemeBrush}" /> <Setter Property="Background" Value="{ThemeResource ApplicationPageBackgroundThemeBrush}" />默认的系统资源是固定的,在资源字典中还可以重新定义主题资源的值,如系统资源不够用,还可以自建ThemeResource