WPF样式选项卡控件选项卡项自定义前景色/背景色

WPF样式选项卡控件选项卡项自定义前景色/背景色,wpf,xaml,data-binding,tabcontrol,tabitem,Wpf,Xaml,Data Binding,Tabcontrol,Tabitem,我是WPF的新手——被各种可能性所吸引,但却感到沮丧。。。。我试图使TabControl上的不同选项卡根据选择的时间具有不同的前景色/背景色。我做的第一件事是创建一个名为PlayerTabItem的新TabItem类,并给它一个Brush SelectedBackground属性。这是一个音乐播放器应用程序,所以这里的“播放器”指的是它在这个应用程序中的使用。(我首先将SelectedBackground创建为一个简单属性,然后创建为一个依赖属性,但这似乎没有改变任何东西,因此我省略了该实现。)

我是WPF的新手——被各种可能性所吸引,但却感到沮丧。。。。我试图使TabControl上的不同选项卡根据选择的时间具有不同的前景色/背景色。我做的第一件事是创建一个名为PlayerTabItem的新TabItem类,并给它一个Brush SelectedBackground属性。这是一个音乐播放器应用程序,所以这里的“播放器”指的是它在这个应用程序中的使用。(我首先将SelectedBackground创建为一个简单属性,然后创建为一个依赖属性,但这似乎没有改变任何东西,因此我省略了该实现。)

class PlayerTabItem:TabItem
{
公共笔刷SelectedBackground{get;set;}
}
然后我在我的XAML中使用了它,它编译得很好(只要我在标记名前面加上“local:”),并识别出我创建的新属性。当然,酒店什么也没做。这就是我被卡住的地方


为了应用背景色,我尝试在PlayerTabItem类中处理选择事件,但这是一条死胡同。(覆盖PlayerTabItem.OnSelected并设置颜色没有任何效果——运行时没有错误,但什么也没做。)然后我尝试添加一个样式,并使用新的ControlTemplate和IsSelected=true的触发器,我开始更接近……如果我只是在触发器中硬编码一种颜色,效果会更好。Setter:


但我真正想要的是绑定到PlayerTabItem的SelectedBackground颜色。我试过这个:


但没有效果。我怀疑我需要某种关于绑定的路径论证,但我不知道是什么。我尝试使用XAMLSpy来帮助我了解发生了什么(元素的层次结构和可能的绑定路径),但我没有做得太多——只是当我试图通过XAMLSpy设置SelectedBackground属性时,它报告没有找到SelectedBackground属性。这怎么可能呢。。。。因为我编译并运行程序没有错误

我希望我所做的是有意义的——我只想在选项卡控件上更改选中选项卡的背景色

  • 要更改选项卡颜色,请编辑模板控件并删除触发器:
    在大纲窗口中,右键单击播放器选项卡:编辑模板/编辑副本。
    您还可以根据焦点、悬停等修改触发器以应用某些样式

  • 首先在PlayerTabItem中创建两个依赖项属性(snippet 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));
    }
    
  • 因此,可以使用依赖属性声明控件,并在进行选择时查看颜色的变化

    <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>
    
    
    
  • 我承认,一定有更好的方法可以做到这一点,而不必倾听事件,只需使用触发器。但我无法让它工作

    请注意,在我的示例中,颜色很简单(红色,…),但您可以使用任何画笔来绘制颜色

    这里的链接中有一个完整的工作演示:


    最佳编码

    1)如果您想使用自己的属性进行绑定,您是对的:您需要声明一个依赖项属性。因此,将其置于控制之下是更好、更合乎逻辑的。2) 您希望TabItem的背景颜色在被选中时有所不同,对吗?是的,您在我试图实现的方面是正确的。对于详细的回答,请回答--我会尽快查看@亚当:你看到回应了吗?我想我已经回答了你的问题对不起,忙碌的一周——这个周末会有机会的——再次感谢你抽出时间