Изменение темы в приложении Windows 10 UWP программным способом

я смог изменить тему, используя this.RequestedTheme = ElementTheme.Dark; Но мне нужен весь уровень приложения, так как это только меняет тему текущей страницы на темную.

всякий раз, когда я пытаюсь это App.Current.RequestedTheme = ApplicationTheme.Dark; Я всегда получаю эту ошибку

исключение типа System.NotSupportedException ' произошло в UWPApp.exe, но не был обработан в пользовательском коде

есть ли такой способ, которым я могу изменить всю тему приложения от светлого до темного или вице наоборот?

Я использую VS2015

3 ответов


обновленный ответ с тем, что я, наконец, решил.

я использовал класс настроек, который содержит все настройки приложений, включая тему для использования. Поскольку тема может быть установлена только тогда, когда она начинается, нам нужно обязательно установить их. Это код, который я использовал:

в приложение.код XAML.cs файл:

public App()
{
    //Load settings
    AppSettings.LoadSettings();
    this.RequestedTheme = AppSettings.SelectedTheme;

    this.InitializeComponent();
}

в приложение.файл xaml убедитесь, что удалить отель:

    RequestedTheme="Light"

если его не удалить, он всегда по умолчанию свет, который невозможно изменить.

таким образом, пользователь может выбрать тему, она сохраняется и используется при запуске приложения. Просто не забудьте загрузить его и применить на этапе инициализации приложения.


RequestedTheme приложения может быть обновлен только в конструкторе.Однако (как вы обнаружили) , RequestedTheme страницы может быть обновлен в любое время во время выполнения.

Это действительно раздражает, я знаю, и нет много информации об этой ситуации, кроме этой страницы MSDN:

https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.application.requestedtheme?f=255&MSPPError=-2147217396

тема может быть только установите, когда приложение запускается, а не во время его работы. Попытка установить RequestedTheme во время работы приложения вызывает исключение (NotSupportedException для кода Microsoft .NET). Если вы предоставляете пользователю возможность выбрать тему, которая является частью пользовательского интерфейса приложения, необходимо сохранить параметр в данных приложения и применить его при перезапуске приложения.

должны быть обходные пути, но они будут очень глупыми.Microsoft делает это в своих собственных официальных приложениях, таких как Groove, хотя ...

мое решение выполняет обновление темы на уровне элемента, а не на уровне приложения.

  1. Создайте собственную базовую страницу (наследуется от Page)
  2. сохраните настройки в статическом классе и создайте событие для отслеживания изменений модели.
  3. в конструкторе вашей базовой страницы слушайте это событие и применяйте изменения, когда есть.

Я не могу предоставить пример кода прямо сейчас (так как я очень занят сегодня), но это, безусловно, самый эффективный способ ИМХО.


Я нашел другое решение, которое сработало довольно хорошо для меня. Если приложение имеет корневой фрейм, который загружает страницы (что имеет место по умолчанию), я мог бы установить запрошенную тему этого корневого фрейма на нужное значение, и тема приложения была изменена без перезапуска. Код выглядит так:

// Set theme for window root.
if (Window.Current.Content is FrameworkElement frameworkElement)
{
   frameworkElement.RequestedTheme = theme;
}

Я получил этот фрагмент из репозитория Windows Template Studio GitHub здесь, так что это, кажется, лучший способ сделать это.