2015-12-29 31 views
0

我試圖讓我的WPF的TabItems居中的標題文本標題文本。但無論哪一種的Horizo​​ntalAlignment和的Horizo​​ntalAlignment(中心或拉伸)我對ContentPresenter及其含邊界設定的組合,文本總是出現左對齊,而不是居中。我也沒有看到TabItem上的Property,我可以用它直接在Tab項上設置它(事實證明,TabItem上的Horizo​​ntalAlignment做了完全不同的事情)。如何集中在的TabItems

我的代碼現在的問題是這樣的:

<Grid TextElement.Foreground="White" TextElement.FontSize="17" TextElement.FontFamily="Times New Roman" HorizontalAlignment="Center" > 
    <Border Name="TabBorder" BorderThickness="8 8 8 0" CornerRadius="12 12 0 0" 
      Background="{StaticResource bandBrush}" HorizontalAlignment="Center" > 
    <ContentPresenter HorizontalAlignment="Stretch" ContentSource="Header" Height="24" Width="100" /> 
    </Border> 
</Grid> 

回答

3

你可以把ContentPresenter與Horizo​​ntalAlignment屬性設置爲Strecth和Horizo​​ntalContentAlignment設置爲中心的標籤, 退房this

<Grid x:Name="gridTabItem"> 
    <Border x:Name="Border" Margin="0,0,0,0" BorderBrush="{x:Null}" CornerRadius="7,7,0,0" BorderThickness="0" > 
    <Label x:Name="label" HorizontalAlignment="Stretch" HorizontalContentAlignment="Center"> 
     <ContentPresenter x:Name="ContentSite" 
         VerticalAlignment="Stretch" 
       HorizontalAlignment="Center" 
       ContentSource="Header" Margin="10,2,10,2" 
       RecognizesAccessKey="True"> 
     </ContentPresenter> 
    </Label> 

    </Border> 
    <Rectangle x:Name="rectangle" HorizontalAlignment="Left" Height="4" Margin="0,41, 0,0" Stroke="{x:Null}" VerticalAlignment="Top" Width="{Binding ActualWidth, ElementName=gridTabItem}" StrokeThickness="0" Fill="{x:Null}"/> 
    <Rectangle x:Name="rectangle1" HorizontalAlignment="Left" Height="1" Margin="0,43,0,0" Stroke="{x:Null}" StrokeThickness="0" VerticalAlignment="Top" Width="{Binding ActualWidth, ElementName=gridTabItem}" Fill="#FFEEEEEE"/> 
    <Rectangle x:Name="glow" HorizontalAlignment="Left" Height="41" Margin="0" Stroke="{x:Null}" StrokeThickness="0" VerticalAlignment="Top" Width="{Binding ActualWidth, ElementName=gridTabItem}" Fill="{x:Null}"/> 
</Grid> 
+0

謝謝。如果我添加標籤,設置它的Horizo​​ntalAlignment以拉伸和其Horizo​​ntalContentAlignment到中心,然後設置contentPresenter的Horizo​​ntalAlignment以中心,然後將文本*仍然*獲取左對齊。但是,如果我將代碼複製/粘貼到我的代碼而不是我自己的代碼中,那麼頭*就是*居中!所以這段代碼可能是正確的,但我仍然必須弄清爲什麼當我採用相同的結構和設置時,我自己的代碼不起作用。以後可能會接受這個答案... – Holland

+0

實際上,可以將其擁有的事實,我設置我的ContentPresenter的寬度呢? (在上面的代碼中沒有顯示,因爲我刪除了我認爲不相關的東西)。當我刪除寬度時,文本可能居中 - 但很難看到,因爲標籤項變得非常窄以至於文本恰好適合內部(即tabitem寬度取決於文本佔用的空間)。這不是我想要的,我希望所有標籤都具有相同的寬度,而不考慮文本長度。 – Holland

+0

實際上,當我簡單地設置TabItem而不是ContentPresenter上的寬度時,它完美地工作。完善。 – Holland

0

我知道這個問題是有點老了,有已經被接受的答案,但我想,我的回答可以幫助的人。

我的問題是,我需要均勻擴散的TabItem標題(每個標題的TabItem具有相同的寬度)和內部需要的標題文字爲中心。所以這是我如何實現這一點:

TabControl.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:local="clr-namespace:FMEA.Resources.Styles" 
       xmlns:Converters="clr-namespace:FMEA.Converters" 
       xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"> 

<Style x:Key="Custom_TabItem" BasedOn="{StaticResource {x:Type TabItem}}" TargetType="{x:Type TabItem}"> 
    <Setter Property="Width"> 
     <Setter.Value> 
      <MultiBinding> 
       <MultiBinding.Converter> 
        <Converters:TabSizeConverter /> 
       </MultiBinding.Converter> 
       <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type TabControl}}" /> 
       <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type TabControl}}" Path="ActualWidth" /> 
      </MultiBinding> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TabItem}"> 
       <Grid x:Name="tabItem"> 
        <Border x:Name="Border"> 
         <ContentPresenter x:Name="content" 
              VerticalAlignment="Center" 
              HorizontalAlignment="Center" 
              ContentSource="Header" /> 
        </Border> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="Foreground" Value="Gray" /> 
        </Trigger> 
        <Trigger Property="IsSelected" Value="False"> 
         <Setter Property="Foreground" Value="LightGray" /> 
        </Trigger> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="Foreground" Value="Black" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="HeaderTemplate"> 
     <Setter.Value> 
      <DataTemplate DataType="{x:Type TabItem}"> 
       <Border x:Name="border"> 
        <ContentPresenter> 
         <ContentPresenter.Content> 
          <TextBlock Text="{TemplateBinding Content}" 
             FontSize="22" HorizontalAlignment="Center" /> 
         </ContentPresenter.Content> 
        </ContentPresenter> 
       </Border> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

</ResourceDictionary> 

其中TabSizeConverter是這樣的:

class TabSizeConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     TabControl tabCtrl = values[0] as TabControl; 
     double width = tabCtrl.ActualWidth/tabCtrl.Items.Count; 
     return width <= 1 ? 0 : width - 1; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

使用示例:

<TabItem Header="MyHeader" Style="{StaticResource Custom_TabItem}">