2015-02-13 2 views
2

Я хочу иметь TabControl с несколькими TabItems. Эти TabItems имеют текст заголовка. Эти тексты могут сильно различаться по длине (например, 5 символов длиной и 15 символов).WPF Flexible TabControl Header

Я хочу, чтобы TabControl выравнивал заголовки только в одной строке.

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

Так что, если я хочу использовать vMaxWidth` из 100 для 7 элементов, заголовок вкладки должен быть максимальным 700 в ширину. Если имеется больше свободного места, его следует игнорировать.

Если доступное пространство меньше, я хочу, чтобы это пространство было равномерно распределено между элементами. Если текст отключен, я хочу использовать TextWrapping.

Я пытался несколько подходов к этой проблеме сейчас, это моя текущая настройка:

<Style x:Key="Style-TabControl-Main" TargetType="{x:Type TabControl}"> 
    <Setter Property="SnapsToDevicePixels" Value="True" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TabControl}"> 
       <Grid KeyboardNavigation.TabNavigation="Local"> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto" /> 
         <RowDefinition Height="*" /> 
        </Grid.RowDefinitions> 

        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="*" /> 
         <ColumnDefinition Width="Auto" /> 
        </Grid.ColumnDefinitions> 

        <Border BorderThickness="0,0,0,1" Margin="13,0,0,0" BorderBrush="{StaticResource Brush-White}"> 
         <StackPanel Panel.ZIndex="1" x:Name="HeaderPanel" IsItemsHost="True" KeyboardNavigation.TabIndex="1" Background="Transparent" 
            Orientation="Horizontal"/> 
        </Border> 

        <Border x:Name="Border" 
          Grid.Row="1" Grid.ColumnSpan="2" 
          KeyboardNavigation.TabNavigation="Local" 
          KeyboardNavigation.DirectionalNavigation="Contained" 
          KeyboardNavigation.TabIndex="2" 
          BorderThickness="{TemplateBinding BorderThickness}" 
          Background="{TemplateBinding Background}" 
          BorderBrush="{TemplateBinding BorderBrush}"> 
         <ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent" /> 
        </Border> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

И TabItemStyle

<Style x:Key="Style-TabItem-Main" TargetType="{x:Type TabItem}"> 
    <Setter Property="Height" Value="31"/> 
    <Setter Property="Width" Value="180" /> 
    <Setter Property="Foreground" Value="{DynamicResource Brush-BrightRegular-Foreground}"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TabItem}"> 
       <Border x:Name="Border" Cursor="Hand" 
         Margin="2,0,0,0" 
         BorderThickness="1,1,1,0" 
         CornerRadius="4,4,0,0" 
         BorderBrush="{DynamicResource Brush-BrightRegular-Background}" 
         Background="{DynamicResource Brush-White}"> 
        <ContentPresenter x:Name="Content" VerticalAlignment="Center" HorizontalAlignment="Stretch" ContentSource="Header" RecognizesAccessKey="True" 
             TextBlock.TextAlignment="Center" TextBlock.FontSize="16" /> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="Foreground" Value="{DynamicResource Brush-White}"/> 
         <Setter TargetName="Border" Property="Background" Value="{DynamicResource Brush-DefaultDark-Background}" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Я использую StackPanel вместо TabPanel избавиться «стекирования», который возникает при изменении размера по умолчанию TabControl. Однако я не могу заставить остальные свои требования работать. Я попробовал применить MaxWidth (вместо фиксированной ширины) к заголовкам TabItem, но это, конечно, не работает, потому что элемент, чем сжимается до минимально необходимого размера.

+0

Я работал на TabControl некоторое время назад, так что я не могу гарантировать, что это будет работать, но, во-первых, вам не нужно '