Как изменить цвет фона 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.

Другие вопросы по тегам