Вы не должны связывать Brush с TextBox
s BorderBrush
, это означает, что вы установили фиксированное значение Brush для BorderBrush
.Когда вы используете Binding
и IValueConverter
в своем xaml, он присваивает значение SolidColorBrush
в ресурсе «MyBorderBrushMandatory» или «MyBorderBrush» для BorderBrush
, это статическое значение и не изменит базу на основе темыменять.Короче говоря, похоже, что вы устанавливаете красный фиксированный SolidColorBrush
на BorderBrush
и не имеет значения для динамического ресурса темы.
Если вы хотите, чтобы BorderBrush
из TextBox
изменился, когдаизменив тему, вы можете просто заменить свой код привязки xaml TextBox
ссылкой на ресурсы темы:
<TextBox PlaceholderText="My PlaceholderText" Height="100" Width="500"
HorizontalAlignment="Center"
BorderBrush="{ThemeResource MyBorderBrushMandatory}"
VerticalAlignment="Center" ></TextBox>
С другой стороны, если вы хотите использовать привязку для изменения BorderBrush
из TextBox
когда тема изменилась, вы должны заставить свойство IsError
реализовать INotifyPropertyChanged
, в то же время вы должны подписаться на событие ActualThemeChanged , чтобы изменить значение свойства IsError
и получить значение SolidColorBrush
изваш BorderBrushColorConverter
затем обновите пользовательский интерфейс.
Ниже приведен пример, который зависит от вашего кода выше:
MainPage.xaml:
<Page.Resources>
<local:BorderBrushColorConverter x:Key="BorderBrushColorConverter"/>
</Page.Resources>
<StackPanel>
<TextBox PlaceholderText="My PlaceholderText" Height="100" Width="500" HorizontalAlignment="Center"
BorderBrush="{Binding IsError, Converter={StaticResource BorderBrushColorConverter}}"
VerticalAlignment="Center" ></TextBox>
<Button Content="Change Theme" Click="Button_Click"></Button>
</StackPanel>
MainPage.xaml.cs:
public sealed partial class MainPage : Page,INotifyPropertyChanged
{
public MainPage()
{
this.InitializeComponent();
this.DataContext = this;
this.ActualThemeChanged += MainPage_ActualThemeChanged;
}
public event PropertyChangedEventHandler PropertyChanged;
private void MainPage_ActualThemeChanged(FrameworkElement sender, object args)
{
IsError = !IsError;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
this.RequestedTheme = this.RequestedTheme == ElementTheme.Light ? ElementTheme.Dark : ElementTheme.Light;
}
private void OnPropertyChanged(string Name)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(Name));
}
}
private bool? isError=true;
public bool? IsError
{
get
{
return isError;
}
set
{
isError = value;
OnPropertyChanged("IsError");
}
}
}
--- Обновление ---
Давайте поговорим о вашем образце.Во-первых, мы все знаем, что вы установили TextBox
BorderBrush
, получив Ресурсы приложений из App.xaml.В вашем Page2.xaml.cs вы используете следующий код:
this.RequestedTheme = App.SelectedTheme;
Этот код устанавливает только тему пользовательского интерфейса, которая используется UIElement (и его дочерними элементами) для определения ресурса, то есть, код только устанавливает тему страницы, но не приложение.Ваше приложение работает с использованием темы, заданной пользователем в настройках Windows по умолчанию («Настройки»> «Персонализация»> «Цвета»> «Выберите режим приложения по умолчанию»), и вы также можете установить свойство RequestedTheme приложения, чтобы переопределить пользовательское значение по умолчанию иукажите, какая тема используется.
В качестве Примечания часть:
Тема может быть установлена только при запуске приложения,нет, пока он работает.Попытка установить RequestedTheme во время работы приложения вызывает исключение (NotSupportedException для кода Microsoft .NET).Если вы даете пользователю возможность выбрать тему, которая является частью пользовательского интерфейса приложения, вы должны сохранить настройки в данных приложения и применить их при перезапуске приложения.
Поэтому при изменении страницыRequestedTheme
, это не повлияет на RequestedTheme приложения , это по-прежнему RequestedTheme приложения , установленный в App.xaml вашего образца в качестве кода,
RequestedTheme="Light"
Поэтому, когда вы получаете код Application.Current.Resources
, чтобы получить ресурс приложения, он все равно получает ресурс темы «Light».Он отличается от того, что вы используете ThemeResource .Для этой проблемы ресурс темы - это не то, что вам нужно, вы должны установить в ресурсе какую-то другую цветовую кисть, а затем получить другую базу ресурсов цветной кисти в настройках ресурса вашей страницы, используя StaticResource .
--- Обновление 2 ---
Вот простое решение, просто добавьте ресурс приложения в файл App.xaml,
<Application.Resources>
<Color x:Key="MyBorder">#6b6b6b</Color>
<SolidColorBrush x:Key="MyBorderBrush" Color="{StaticResource MyBorder}" />
<Color x:Key="MyBorderMandatory">#ff0000</Color>
<SolidColorBrush x:Key="MyBorderBrushMandatory" Color="{StaticResource MyBorderMandatory}" />
<Color x:Key="MyBorderDark">#c85332</Color>
<SolidColorBrush x:Key="MyBorderBrushDark" Color="{StaticResource MyBorderDark}" />
<Color x:Key="MyBorderMandatoryDark">#FFD700</Color>
<SolidColorBrush x:Key="MyBorderBrushMandatoryDark" Color="{StaticResource MyBorderMandatoryDark}" />
...
</Application.Resources>
В файле BorderBrushColorConverter.cs измените *Метод 1078 *,
public object Convert(object value, Type targetType, object parameter, string language)
{
var isError = value as bool? ?? false;
if (isError)
{
if (App.SelectedTheme == ElementTheme.Light)
{
return Application.Current.Resources["MyBorderBrushMandatory"] as SolidColorBrush;
}
else
{
return Application.Current.Resources["MyBorderBrushMandatoryDark"] as SolidColorBrush;
}
}
else
{
return null;
}
}
В Page2.xaml измените ссылку на статический ресурс,
<TextBox PlaceholderText="My PlaceholderText" Height="100" Width="500"
HorizontalAlignment="Center" Style="{StaticResource NoHighlightTextBoxStyle}"
BorderBrush="{Binding IsError, Converter={StaticResource BorderBrushColorConverter}}"
VerticalAlignment="Center" ></TextBox>