2015-10-04 2 views
0

Я довольно новичок в WPF - мучительный от возможностей, но разочарование .... Я пытаюсь сделать так, чтобы разные вкладки TabControl отличались друг от друга цвета переднего/заднего фона в зависимости от того, когда они выбраны. Первое, что я сделал, это создать новый класс TabItem под названием PlayerTabItem и присвоить ему свойство Brush SelectedBackground. Это приложение для музыкального плеера, поэтому «игрок» в этом контексте относится к его использованию в этом приложении. (Я первый создал SelectedBackground как простое свойство, а потом как свойство зависимостей, но это, похоже, не изменится ничего, поэтому я опустил его реализации.)WPF-стиль TabControl TabItems пользовательских цветов переднего плана/фона

class PlayerTabItem : TabItem 
{ 
    public Brush SelectedBackground { get; set; } 
} 

Тогда я использовал это в моем XAML , и он скомпилирован в порядке (пока я помещаю «local:» перед именем тега) и узнал новое свойство, которое я создал. Конечно, собственность ничего не делала. Здесь я застрял.

<local:PlayerTabItem Header="Now Playing" SelectedBackground="Blue"/> 
<local:PlayerTabItem Header="Collection" SelectedBackground="Purple"/> 
<local:PlayerTabItem Header="Search" SelectedBackground="Green"/> 

Я попытался обработки события выбора в классе PlayerTabItem для того, чтобы применить цвет фона, но это был тупик. (Overriding PlayerTabItem.OnSelected и настройка цвета там не имела эффекта - бежал без ошибок, но ничего не делал.) Затем я попробовал добавить стиль с новым ControlTemplate и Trigger for IsSelected = true, и я начал приближаться ... это работал, если я просто жестко закодирован цвет в Trigger.Setter:

<Trigger Property="IsSelected" Value="True"> 
    <Setter TargetName="Panel" Property="Background" Value="Purple" /> 
</Trigger> 

Но что я действительно хочу, чтобы связываться с SelectedBackground цвета PlayerTabItem в. Я пробовал это:

<Setter TargetName="Panel" Property="Background" Value="{Binding SelectedBackground}" /> 

Но это не имело никакого эффекта. Я подозревал, что мне нужен какой-то аргумент Path о привязке, но я понятия не имел, что. Я попробовал использовать XAMLSpy, чтобы помочь мне понять, что происходит (насколько иерархия элементов и возможный путь привязки), но я не очень далеко от этого, кроме тех случаев, когда я пытался установить свойство SelectedBackground через XAMLSpy , он сообщил, что свойство SelectedBackground не найдено. Как это могло быть? .... поскольку я скомпилировал и запустил программу без ошибок.

Я надеюсь, что то, что я пытаюсь сделать, имеет смысл - я просто хочу изменить цвет фона выбранных вкладок в элементе управления вкладкой, когда они будут выбраны.

+0

1) Если вы хотите сделать привязку к своему собственному имуществу, вы вернетесь: вам нужно объявить свойство зависимости. Так что это намного лучше и логичнее иметь его в контроле. 2) Вы хотите иметь цвет для фона TabItem, который отличается, когда он выбран, правильно? –

+0

да, вы правы в том, чего я пытаюсь достичь –

ответ

0
  1. Для того, чтобы иметь вкладку цвет изменять, редактировать контроль шаблона и удалить триггеры:
    оконных контурной правой кнопкой мыши на PlayerTabItem: Изменить шаблон/Редактировать копию.
    Вы также можете изменить триггеры применить некоторый стиль в зависимости от фокуса, парить ...

  2. Сначала нужно создать два свойства зависимостей (сниппет propdp + табулирования дважды) в PlayerTabItem, и слушать изменений IsSelected свойство:

    class PlayerTabItem : TabItem 
    { 
        public PlayerTabItem() 
        { 
         Loaded += (sender, e) => { Background = IsSelected ? SelectedBackground : UnSelectedBackground; }; 
         DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(TabItem.IsSelectedProperty, typeof(TabItem)); 
         dpd.AddValueChanged(this, (sender, args) => 
         { 
          Background = IsSelected ? SelectedBackground : UnSelectedBackground; 
          System.Diagnostics.Debug.WriteLine("Changing background of {0} to {1}", this.Header, this.Background); 
         }); 
        } 
        public Brush SelectedBackground 
        { 
         get { return (Brush)GetValue(SelectedBackgroundProperty); } 
         set { SetValue(SelectedBackgroundProperty, value); } 
        } 
        public static readonly DependencyProperty SelectedBackgroundProperty = 
         DependencyProperty.Register("SelectedBackground", typeof(Brush), typeof(PlayerTabItem), new PropertyMetadata(null)); 
        public Brush UnSelectedBackground 
        { 
         get { return (Brush)GetValue(UnSelectedBackgroundProperty); } 
         set { SetValue(UnSelectedBackgroundProperty, value); } 
        } 
        public static readonly DependencyProperty UnSelectedBackgroundProperty = 
         DependencyProperty.Register("UnSelectedBackground", typeof(Brush), typeof(PlayerTabItem), new PropertyMetadata(null)); 
    } 
    
  3. Так управления могут быть объявлены с использованием свойств зависимостей и видеть изменение цвета, когда выбор сделан

    <TabControl > 
        <local:PlayerTabItem SelectedBackground="Red" UnSelectedBackground="Pink" Header="Tab1" Style="{DynamicResource PlayerTabItemStyle1}" /> 
        <local:PlayerTabItem SelectedBackground="Yellow" UnSelectedBackground="Pink" Header="Tab2" Style="{DynamicResource PlayerTabItemStyle1}"/> 
        <local:PlayerTabItem SelectedBackground="Green" UnSelectedBackground="Pink" Header="Tab3" Style="{DynamicResource PlayerTabItemStyle1}"/> 
    </TabControl> 
    

Я признаю, что должно быть лучше сделать это, не слушая события, просто используя триггеры. Но я не мог заставить его работать.

Обратите внимание, что в моем образце цвета являются простыми (красный, ...), но вы можете использовать любую кисть для цветов

Существует полный рабочий демо в ссылке здесь: http://1drv.ms/1NfCl9z

Лучшее кодирование

+0

спасибо за подробный ответ - я посмотрю, как только смогу! –

+0

@Adam: Вы посмотрели ответ? Думаю, я ответил на ваш вопрос –

+0

извините, занятая неделя - посмотрит в эти выходные - еще раз спасибо за то, что вы нашли время –