WPF样式TabControl TabItems自定义前景/背景颜色

时间:2015-10-04 19:18:53

标签: wpf xaml data-binding tabcontrol tabitem

我对WPF很陌生 - 被各种可能性所吸引,但却感到沮丧......我试图让它变得如此不同TabControl上的标签根据选择的时间有不同的foregound / background颜色。我做的第一件事是创建一个名为PlayerTabItem的新TabItem类,并为其提供了一个Brush SelectedBackground属性。这是一个音乐播放器应用程序,因此在此上下文中的“播放器”指的是它在此应用中的使用。 (我首先创建了SelectedBackground作为一个简单的属性,然后作为依赖属性创建,但这似乎没有改变任何东西,所以我省略了该实现。)

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的触发器,我开始越来越近了....如果我刚刚在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。怎么会这样? ....因为我编译并运行程序没有错误。

我希望我尝试做的事情有意义 - 我只是想在选中它们时更改选项卡控件上所选标签的背景颜色。

1 个答案:

答案 0 :(得分:0)

  1. 要更改标签颜色,请编辑模板控件并删除触发器:
    在大纲窗口中右键单击PlayerTabItem:编辑模板/编辑副本 您还可以修改触发器以根据焦点,悬停,......应用某些样式。

  2. 首先在PlayerTabItem中创建两个依赖项属性(snippet propdp + tabulation两次),并监听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>
    
  4. 我承认必须有一个更好的做法,而不是只使用触发器来监听事件。但我无法让它发挥作用。

    请注意,在我的示例中,颜色很简单(红色,...),但您可以使用任何颜色的颜色

    此处的链接中有一个完整的工作演示:http://1drv.ms/1NfCl9z

    最佳编码