2011-05-16 79 views
1

我有一個TabControl與自定義TabItem。視圖xaml看起來像這樣。WPF自定義TabItem在restyle上消失了嗎?

<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行註釋掉,它會顯示出來。

無論如何,我可能已經設置了錯誤。最終目標是擁有可關閉的標籤。

回答

1

摘錄:

首先,如果你不熟悉的主題風格VS風格明確的概念,我建議你閱讀這篇博客http://www.interact-sw.co.uk/iangblog/2007/02/14/wpfdefaulttemplate。所有控件都需要一個主題樣式(通常在名爲Themes的文件夾下名爲Aero.NormalColor.xaml/Generic.xaml/etc的文件中定義),它定義了它們的默認外觀(Template)/屬性和可選的顯式樣式在元素/窗口/應用程序級別使用隱式鍵或顯式鍵)。

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

正如Schalk指出的那樣,DefaultStyleKeyProperty標識了默認Style的鍵,它必須包含在Themes文件夾下的Resource字典中。因此,如果您將CustomTabItem.xaml移動/重命名爲Themes\Generic.xaml,那麼它應該加載並應用。

通過將名爲AeroNormalColor.xaml,Classic.xaml等的文件添加到Themes文件夾中,您還可以基於系統主題創建不同版本的樣式。這些文件也需要有你的風格的副本,大概是視覺上的調整。

您可以從here下載本地控件的默認樣式。這將允許您複製TabItem的默認樣式並將其調整爲您的需要。

或者你可以在這個question中做些什麼,其中關閉按鈕被添加到HeaderTemplate。