WPF自定义TabItem在restyle上消失了吗?

时间:2011-05-16 20:46:00

标签: c# wpf custom-controls prism

我有一个带有自定义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行,它就会出现。

我可能已经把这一切都设置错了。最终目标是拥有可关闭的标签。

2 个答案:

答案 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。