2015-10-04 119 views
0

我很新的WPF - 誘惑的可能性,但越來越沮喪....我試圖讓它如此不同的TabControl標籤有不同根據他們被選中的時間,預告/背景顏色。我做的第一件事是創建一個名爲PlayerTabItem的新TabItem類,並給它一個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類中處理選擇事件以應用背景顏色,但這是一個死衚衕。 (覆蓋PlayerTabItem.OnSelected並設置顏色沒有任何影響 - 沒有錯誤地運行,但什麼都沒做。)然後,我試着用一個新的ControlTemplate和一個觸發器爲IsSelected = true添加一個Style,然後我開始越來越接近....它工作如果我只是硬編碼在Trigger.Setter顏色:

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

但我真正想要的是綁定到PlayerTabItem的SelectedBackground顏色。我試過這個:

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

但它沒有效果。我懷疑我需要一些有關綁定的Path參數,但我不知道是什麼。我嘗試過使用XAMLSpy來幫助我看看究竟發生了什麼(就元素的層次結構和可能的綁定路徑而言),但是我並沒有太多瞭解 - 除了當我嘗試通過XAMLSpy設置SelectedBackground屬性,它報告沒有找到SelectedBackground屬性。那怎麼可能? ....因爲我編譯和運行程序沒有錯誤。

我希望我想要做的是有道理的 - 我只是想在選中它們時更改選項卡控件上選定選項卡的背景顏色。

+0

1)如果你想要綁定你自己的屬性,你是對的:你需要聲明一個依賴屬性。因此,把它放在一個控制系統中會更好,更合乎邏輯。 2)你想爲選擇不同的TabItem的背景設置顏色,對嗎? –

+0

是的,你在我想要達到的目標中是正確的 –

回答

0
  1. 爲了有標籤的顏色改變,編輯模板控制,並刪除觸發器:
    在大綱窗口中,右鍵單擊PlayerTabItem:編輯模板/編輯副本。
    你也可以修改的觸發取決於重點應用一些風格,懸停,...

  2. 首先在PlayerTabItem創建兩個依賴屬性(片段propdp +製表兩次),並聽取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

@亞當:你看了迴應?我想我回答了你的問題 –

+0

抱歉,繁忙的一週 - 將在這個週末看 - 再次感謝您花時間 –