WinUI3-动态切换主题

文章来源: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,不如先用着。

标签:WinUI, 应用开发

猜你喜欢

转载自blog.csdn.net/white_night_SZTU/article/details/132819719