我有一个带有自定义TabItem的TabControl。视图xaml看起来像这样。
<UserControl x:Class="PeripheryModule.Views.MainTabView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:PeripheryModule.Controls"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<TabControl>
<TabItem Header="TabItem 4" />
<local:CustomTabItem Header="Testing" />
</TabControl>
</Grid>
</UserControl>
CustomTabItem.xaml文件看起来像这样
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:PeripheryModule.Controls">
<Style TargetType="{x:Type local:CustomTabItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomTabItem}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
和CustomTabItem.xaml.cs文件看起来像这样
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace PeripheryModule.Controls
{
public class CustomTabItem : TabItem
{
static CustomTabItem()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomTabItem), new FrameworkPropertyMetadata(typeof(CustomTabItem)));
}
}
}
我没有抛出任何错误,所有发生的事情都是tabItem根本没有显示出来。但是,如果我在CustomTabItem.aspx.cs中注释掉DefaultStyleKeyProperty
行,它就会出现。
我可能已经把这一切都设置错了。最终目标是拥有可关闭的标签。
答案 0 :(得分:1)
摘录:
首先,如果您不熟悉主题风格与显式风格的概念,我建议您阅读此博客http://www.interact-sw.co.uk/iangblog/2007/02/14/wpfdefaulttemplate。所有控件都需要一个主题样式(通常在名为Themes的文件夹下名为Aero.NormalColor.xaml / Generic.xaml / etc的文件中定义),它定义了它们的默认外观(模板)/属性和一个可选的显式样式(定义了它)在元素/窗口/应用程序级别,使用隐式键或显式键)。
DefaultStyleKeyProperty定义用于查找控件主题样式的键。如果您注释掉该行,您将最终得到基类的默认主题样式。作为快速测试,将自定义控件的基类更改为Button。如果您注释掉该行,您的自定义控件将获得Button的主题样式,它看起来像一个按钮。如果您没有注释掉该行,您的自定义控件将获得generic.xaml中定义的默认样式。
来自:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/9df46c62-3715-4e16-8ef6-538068c28eb6/
编辑:
您是否有任何理由不想定义标题模板并进行分配?
离。 <TabItem Header="Testing" HeaderTemplate="{StaticResource customHeaderTemplate}" />
答案 1 :(得分:0)
正如Schalk所指出的,DefaultStyleKeyProperty标识默认Style的键,该键必须包含在Themes文件夹下的Resource字典中。因此,如果您将CustomTabItem.xaml
移动/重命名为Themes\Generic.xaml
,则应加载并应用。
您还可以根据系统主题创建不同版本的样式,方法是将名为AeroNormalColor.xaml,Classic.xaml等的文件添加到Themes文件夹中。这些文件也需要有你的Style的副本,大概是通过视觉调整。
您可以从here下载本机控件的默认样式。这将允许您复制TabItem的默认样式并根据您的需要进行调整。
或者您可以执行类似于此question的操作,其中关闭按钮已添加到HeaderTemplate。