#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}"/>
Это довольно просто, но не может быть найдено в других вопросах.