繁体   English   中英

WPF自定义TabItem在重新设置样式后消失吗?

[英]WPF custom TabItem disappears upon restyle?

我有一个带有自定义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行,它将显示。

无论如何,我可能都将这一切设置错了。 最终目标是要关闭标签页。

摘抄:

首先,如果您不熟悉主题样式与显式样式的概念,建议您阅读此博客http://www.interact-sw.co.uk/iangblog/2007/02/14/wpfdefaulttemplate 所有控件都需要主题样式(通常在主题文件夹下的Aero.NormalColor.xaml / Generic.xaml / etc文件中定义),该主题样式定义其默认外观(模板)/属性和可选的显式样式(已定义)在元素/窗口/应用程序级别使用隐式键或显式键)。

DefaultStyleKeyProperty定义用于查找控件主题样式的键。 如果注释掉该行,您将得到基类的默认主题样式。 作为一项快速测试,将自定义控件的基类更改为Button。 如果注释掉该行,则您的自定义控件将获得Button的主题样式,它看起来像一个按钮。 如果您不注释掉该行,则您的自定义控件将获得generic.xaml中定义的默认样式。

来自: http : //social.msdn.microsoft.com/Forums/zh-CN/wpf/thread/9df46c62-3715-4e16-8ef6-538068c28eb6/

编辑:

有什么理由为什么您不想定义标题模板并分配它?

例如 <TabItem Header="Testing" HeaderTemplate="{StaticResource customHeaderTemplate}" />

正如Schalk所指出的,DefaultStyleKeyProperty标识默认样式的键,该键必须包含在Themes文件夹下的Resource字典中。 因此,如果将CustomTabItem.xaml移动/重命名为Themes\\Generic.xaml ,则应加载并应用它。

您还可以根据系统主题创建不同版本的样式,方法是将名为AeroNormalColor.xaml,Classic.xaml等的文件添加到Themes文件夹中。 这些文件还需要具有样式的副本,大概是通过视觉调整来实现的。

您可以从此处下载本机控件的默认样式。 这将允许您复制TabItem的默认样式,并根据需要进行调整。

或者,您可以在此问题中执行类似的操作,其中将关闭按钮添加到HeaderTemplate中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM