WPF пользовательский TabItem исчезает при рестайле? - PullRequest
1 голос
/ 17 мая 2011

У меня есть TabControl с пользовательским TabItem. Вид 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. Однако, он появится, если я закомментирую строку DefaultStyleKeyProperty в CustomTabItem.aspx.cs.

Я, наверное, все равно все неправильно настроил. Конечная цель - иметь закрывающиеся вкладки.

Ответы [ 2 ]

1 голос
/ 17 мая 2011

Выдержка:

Во-первых, если вы не знакомы с концепцией стиля темы против явного стиля, я предлагаю вам прочитать этот блог http://www.interact -sw.co.uk / iangblog/ 2007/02/14 / wpfdefaulttemplate .Всем элементам управления нужен стиль темы (который обычно определяется в файлах с именем Aero.NormalColor.xaml / Generic.xaml / etc в папке с именем Themes), который определяет их внешний вид по умолчанию (Шаблон) / свойства и необязательный явный стиль (который определяетсяна уровне элемента / окна / приложения с неявным ключом или явным ключом).

DefaultStyleKeyProperty определяет ключ, используемый для поиска стиля темы элемента управления.Если вы закомментируете строку, вы получите стиль темы по умолчанию для базового класса.В качестве быстрого теста измените базовый класс настраиваемого элемента управления на Button.Если вы закомментируете строку, ваш пользовательский элемент управления получит стиль темы Button и будет выглядеть как кнопка.Если вы не закомментируете строку, ваш пользовательский элемент управления получит стиль по умолчанию, определенный в generic.xaml.

От: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/9df46c62-3715-4e16-8ef6-538068c28eb6/

Редактировать:

Есть ли причина, по которой вы не хотите определять шаблон заголовка и назначать его?

ex.<TabItem Header="Testing" HeaderTemplate="{StaticResource customHeaderTemplate}" />

0 голосов
/ 17 мая 2011

Как указывает Шалк, свойство DefaultStyleKeyProperty идентифицирует ключ к стилю по умолчанию, который должен содержаться в словаре ресурсов в папке Темы.Поэтому, если вы переместите / переименуете свой CustomTabItem.xaml в Themes\Generic.xaml, его следует загрузить и применить.

Вы также можете создавать различные версии своих стилей на основе системных тем, добавляя файлы с именемAeroNormalColor.xaml, Classic.xaml и т. Д. В папку Темы.В этих файлах также должны быть копии вашего стиля, предположительно с визуальными изменениями.

Вы можете загрузить стили по умолчанию для собственных элементов управления из здесь .Это позволит вам скопировать стиль по умолчанию для TabItem и настроить его под свои нужды.

Или вы можете сделать что-то подобное в этом вопросе , где кнопка закрытия добавляется в шаблон заголовка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...