Как изменить цвет фона TabPanel в TabControl?
Я знаю, как установить цвет фона TabPanel в xaml следующим образом:
<TabControl.Resources>
<Style x:Key="noClue" TargetType="{x:Type TabPanel}">
<Setter Property="Background" Value="Transparent"></Setter>
</Style>
</TabControl.Resources>
Однако я хочу изменить этот цвет фона, когда нажимаю кнопку в приложении WPF, что означает его изменение во время выполнения. Есть способ сделать это?
Спасибо заранее за ваше время.
1 ответ
Да, вы можете привязать свойство Background TabPanel к свойству в View / ViewModel и изменить его, когда вы нажмете кнопку. XAML для привязки будет выглядеть примерно так:
<TabPanel Background="{Binding Path=BackgroundColor}"/>
Где ваше свойство имя BackgroundColor. Фон - это кисть, поэтому примите это во внимание, когда будете управлять своими привязками. Вы также можете добиться привязки из стиля, но вам может понадобиться RelativeSource
В стиле, попробуйте это
<Setter Property="Background" Value="{Binding BackgroundColor}" />
Если ваше окно связано с DataContext. Также попробуйте удалить x:Key из вашего стиля. Это не нужно.
РЕДАКТИРОВАТЬ: Это сработало
Стиль
<Window.Resources>
<Style TargetType="{x:Type TabPanel}">
<Setter Property="Background" Value="{Binding BackgroundColor}"/>
</Style>
</Window.Resources>
Окно
public partial class MainWindow : Window, INotifyPropertyChanged
{
private SolidColorBrush backgroundColor = new SolidColorBrush(Colors.Black);
public SolidColorBrush BackgroundColor
{
get { return backgroundColor; }
set
{
if (backgroundColor == value)
return;
backgroundColor = value;
RaisePropertyChanged(nameof(backgroundColor));
}
}
public MainWindow()
{
InitializeComponent();
// Make sure to set the DataContext to this!
DataContext = this;
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
private void Button_Click(object sender, RoutedEventArgs e)
{
// Change the color through the property
if (BackgroundColor.Color == Colors.Black)
BackgroundColor = new SolidColorBrush(Colors.Transparent);
else
BackgroundColor = new SolidColorBrush(Colors.Black);
}
}
Это привязывает к представлению, где вы можете захотеть абстрагировать это к ViewModel и привязать к нему. Кроме того, если вы переместите эту цветовую логику в ViewModel, вы также можете изменить SolidColorBrush
в свойстве BackgroundColor просто Color или какой-либо другой тип, независимый от пользовательского интерфейса, но это зависит от вас. Ознакомьтесь с этой и другими статьями, связанными с WPF MVVM, для получения дополнительной информации о MVVM и привязке к ViewModels.