2015-10-04 120 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

抱歉,繁忙的一周 - 将在这个周末看 - 再次感谢您花时间 –