WPF样式选项卡控件选项卡项自定义前景色/背景色
我是WPF的新手——被各种可能性所吸引,但却感到沮丧。。。。我试图使TabControl上的不同选项卡根据选择的时间具有不同的前景色/背景色。我做的第一件事是创建一个名为PlayerTabItem的新TabItem类,并给它一个Brush SelectedBackground属性。这是一个音乐播放器应用程序,所以这里的“播放器”指的是它在这个应用程序中的使用。(我首先将SelectedBackground创建为一个简单属性,然后创建为一个依赖属性,但这似乎没有改变任何东西,因此我省略了该实现。)WPF样式选项卡控件选项卡项自定义前景色/背景色,wpf,xaml,data-binding,tabcontrol,tabitem,Wpf,Xaml,Data Binding,Tabcontrol,Tabitem,我是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属性。这怎么可能呢。。。。因为我编译并运行程序没有错误
我希望我所做的是有意义的——我只想在选项卡控件上更改选中选项卡的背景色
在大纲窗口中,右键单击播放器选项卡:编辑模板/编辑副本。
您还可以根据焦点、悬停等修改触发器以应用某些样式
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的背景颜色在被选中时有所不同,对吗?是的,您在我试图实现的方面是正确的。对于详细的回答,请回答--我会尽快查看@亚当:你看到回应了吗?我想我已经回答了你的问题对不起,忙碌的一周——这个周末会有机会的——再次感谢你抽出时间