WPF 自定义选项卡项在重新设置样式时消失

本文关键字:设置 样式 消失 新设置 选项 自定义 WPF | 更新日期: 2023-09-27 17:56:30

我有一个带有自定义 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)));
        }
    }
}

我没有抛出任何错误,发生的所有情况只是选项卡项根本没有显示。但是,如果我注释掉 CustomTabItem.aspx.cs 中的DefaultStyleKeyProperty行,它就会显示出来。

无论如何,我可能把这一切都设置错了。最终目标是拥有可关闭的选项卡。

WPF 自定义选项卡项在重新设置样式时消失

摘录:

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

DefaultStyleKey属性定义用于查找控件的主题样式的键。如果注释掉该行,则最终将得到基类的默认主题样式。作为快速测试,将自定义控件的基类更改为 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}" />

正如Schalk指出的那样,DefaultStyleKeyProperty标识默认Style的键,该键必须包含在Theme文件夹下的资源字典中。因此,如果您移动/重命名CustomTabItem.xaml以低于 Themes'Generic.xaml ,那么它应该加载并应用。

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

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

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