文章来源:WinUI3-动态切换主题 – WhiteNight's Site
2023年5月31日
几行代码搞定切换应用主题。
示例代码
light-dark主题间的切换。
直接放代码。我这里用的是toggleSwitch去作为切换主题的触发。当然用button或者其他的去触发该事件也是可以的,照着自己的程序修改即可。
private void ChangeAppTheme(object sender, RoutedEventArgs e)
{
if(preLoadSetting==false)
{
ToggleSwitch toggleSwitch = sender as ToggleSwitch;
if (toggleSwitch.IsOn == true)
{
if (MainWindow.current.Content is FrameworkElement rootElement)
{
rootElement.RequestedTheme = ElementTheme.Dark;
}
}
else
{
if (MainWindow.current.Content is FrameworkElement rootElement)
{
rootElement.RequestedTheme = ElementTheme.Light;
}
}
}
}
说明几点需要注意的地方:
-
MainWindow.current.Content这点经常容易出问题。当你用程序自带的MainWindow.Current时经常会发现返回的内容为空,或者其本身就为空。导致你没法通过current.content的方法去做相关操作。
我的解决方法:我也不知道为啥会出现这问题。所以我选择在程序初始化的时候自己定义一个current,然后自己对这个current初始化赋值。代码会放在后面。
-
preLoadSetting这个参数是为了”用户在从设置页面切换到其他页面时,才切换回设置页面。设置页面的选项能根据当前应用的状态自行调整。比如如果当前已经是深色主题,那么该按钮就应该是On。
但问题是每次On的时候它都会自动触发对应的响应事件。很明显,这相当于“你只想让它读,但不想让它写”。所以额外建个参数用于按钮信息的初始化,
其中,current的初始化代码如下,current是窗口的current。所以应该在你窗口初始化的时候就定义current。其实上就是static+this。
public MainWindow()
{
this.InitializeComponent();
current = this;
}
public static MainWindow current;
写者注
我也不知道为什么网上的方法都是跟着官方那种新建资源字典,或者是通过加载page的时候去自动更改theme。后来我去stackflow上搜了下,才发现了这种“过于简单”的方法。
但我不知道为什么几乎没什么人提到这种方法。不过由于这种方法过于简洁,所以我怀疑可能是这种方法有bug?但起码我目前没发现有什么bug,不如先用着。
文章来源:https://www.uudwc.com/A/y5PYv/
标签:WinUI, 应用开发文章来源地址https://www.uudwc.com/A/y5PYv/