Как изменить цвет, чтобы настроить настройку темы в UWP?

#c# #windows #xaml #uwp

#c# #Windows #xaml #uwp

Вопрос:

Просто хотите установить Foreground цвет a TextBlock LightGreen в темном режиме, установите DarkGreen в светлом режиме. В моем приложении есть настройка темы. Я хочу, чтобы цвет регулировал как системные настройки, так и настройки приложения.

Я попробовал это при загрузке страницы:

 var isDark = ThemeSelectorService.Theme == ElementTheme.Dark;
if(ThemeSelectorService.Theme == ElementTheme.Default)
{
   isDark = Application.Current.RequestedTheme == ApplicationTheme.Dark;
}
PriceText.Foreground = new SolidColorBrush(isDark ? Colors.LightGreen : Colors.DarkGreen);
 
 <TextBlock x:Name="PriceText" Text="This is a Text"/>
 

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

Комментарии:

1. Не могли бы вы сказать мне, что такое ThemeSelectorService. Тема представляет, представляет ли она свойство PriceText.RequestTheme? Было бы лучше, если бы вы могли предоставить нам код о том, как вы меняете тему в code-behind.

2. ThemeSelectorService.Theme представлять RequestedTheme для Window.Current.Content

Ответ №1:

Когда системный цвет меняется, метод page loaded вызываться не будет. Вы могли бы использовать пользовательские настройки.Событие ColorValuesChanged для отслеживания изменений системного цвета.

когда я изменяю системные настройки, цвет не изменится до перезагрузки на эту страницу

Если вы измените цвет своего приложения, изменив значение FrameworkElement .Запрошенное свойство темы, которое может переопределять уровень приложения RequestedTheme , вам необходимо изменить значение FrameworkElement.RequestedTheme свойства на ElementTheme.Default , чтобы разрешить FrameworkElement.RequestedTheme использование приложения.Запрошенная тема без перезагрузки страницы.

Пожалуйста, проверьте следующий код, чтобы разрешить настройку настройки цвета в системе:

 public MainPage()
{
    this.InitializeComponent();
    ……
    uiSettings.ColorValuesChanged  = UiSettings_ColorValuesChanged;
}

private async void UiSettings_ColorValuesChanged(UISettings sender, object args)
{
    var isDark=false;
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        //Change the RequestedTheme of elements to ElementTheme.Default
        // if you have changed some elements' RequestedTheme property
        RequestedTheme = ElementTheme.Defau<
        ThemeSelectorService.Theme = ElementTheme.Defau<

        isDark = Application.Current.RequestedTheme == ApplicationTheme.Dark;
        PriceText.Foreground = new SolidColorBrush(isDark ? Colors.Green : Colors.Red);
    });
}
 

Комментарии:

1. У меня это сработало. Но все еще интересно, есть ли более простой способ создать тему, похожую ApplicationForegroundThemeBrush на .

2. Вы можете использовать ThemeResource для изменения переднего плана элементов управления текстовыми блоками при изменении темы. Обратите внимание, чтобы изменить RequestedTheme элементов на ElementTheme. По умолчанию, если вы изменили свойство RequestedTheme некоторых элементов в пользовательских настройках. Обработчик событий ColorValuesChanged.

3. Например, <ResourceDictionary.ThemeDictionaries><ResourceDictionary x:Key="Light"> <SolidColorBrush x:Key="foregroundBrush" Color="Red"/> </ResourceDictionary> <ResourceDictionary x:Key="Dark"> <SolidColorBrush x:Key="foregroundBrush" Color="Green"/> </ResourceDictionary></ResourceDictionary.ThemeDictionaries> …… <TextBlock Foreground="{ThemeResource foregroundBrush}" >Hello world</TextBlock>

4. Да, это именно то, что я хочу!

Ответ №2:

Ответ от YanGu

Шаг 1: добавьте ResourceDictionary.ThemeDictionaries в ResourceDictionary

 <ResourceDictionary.ThemeDictionaries>
    <ResourceDictionary x:Key="Light">
        <SolidColorBrush x:Key="PriceBrush" Color="DarkGreen"/>
    </ResourceDictionary>
    <ResourceDictionary x:Key="Dark">
        <SolidColorBrush x:Key="PriceBrush" Color="LightGreen"/>
    </ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
 

Шаг 2: используйте SolidColorBrush для вашего пользовательского элемента управления

 <TextBlock Text="This is a text" Foreground="{ThemeResource PriceBrush}"/>
 

Это довольно просто, но не может быть найдено в других вопросах.