2016-08-02 7 views
1

У меня есть TabControl, который привязан к ViewModel. Я хочу, чтобы установить запас автогенерируемая TabPanel, но я не могу сделать это, потому что я считаю, что стиль установлен рядный с помощью реализации TabControl в ...Как переопределить встроенный стиль в xaml

Вот мой стиль ...

<TabControl.Resources> 
    <Style TargetType="{x:Type TabPanel}"> 
     <Setter Property="Margin" Value="14,0,0,0" /> 
    </Style> 
</TabControl.Resources> 

и полученный стиль с помощью Visual Studio поживет собственность Исследователь, как это ...

enter image description here

UPDATE 1:

Вот XAML для ItemTemplate, который генерирует сам TabPanel:

<TabControl.ItemTemplate> 
    <DataTemplate> 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition /> 
       <RowDefinition /> 
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition MaxWidth="150" /> 
      </Grid.ColumnDefinitions> 
      <Image Grid.Row="0" Grid.Column="0" Source="{Binding ImageUri}" 
        Height="25" Width="35" Margin="0,0,0,10" /> 
      <TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding TestName}" TextAlignment="Center" 
         TextWrapping="Wrap" FontFamily="Open Sans" FontWeight="Regular" FontSize="14" /> 
     </Grid> 
    </DataTemplate> 
</TabControl.ItemTemplate> 

ответ

0

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

Пример шаблона взят из MSDN

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="" Width="500" Height="500"> 
<Window.Resources> 

    <Style TargetType="{x:Type TabControl}"> 
     <Setter Property="OverridesDefaultStyle" 
       Value="True" /> 
     <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> 
         <VisualStateManager.VisualStateGroups> 
          <VisualStateGroup x:Name="CommonStates"> 
           <VisualState x:Name="Disabled"> 
            <Storyboard> 
             <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border" 
                     Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)"> 
              <EasingColorKeyFrame KeyTime="0" Value="#FFAAAAAA" /> 
             </ColorAnimationUsingKeyFrames> 
            </Storyboard> 
           </VisualState> 
          </VisualStateGroup> 
         </VisualStateManager.VisualStateGroups> 
         <TabPanel x:Name="HeaderPanel" 
            Grid.Row="0" 
            Panel.ZIndex="1" 
            Margin="14,0,4,0" 
            IsItemsHost="True" 
            KeyboardNavigation.TabIndex="1" 
            Background="Transparent" /> 
         <Border x:Name="Border" 
           Grid.Row="1" 
           BorderThickness="1" 
           CornerRadius="2" 
           KeyboardNavigation.TabNavigation="Local" 
           KeyboardNavigation.DirectionalNavigation="Contained" 
           KeyboardNavigation.TabIndex="2"> 
          <Border.Background> 
           <LinearGradientBrush EndPoint="0.5,1" 
                StartPoint="0.5,0"> 
            <GradientStop Color="{DynamicResource ContentAreaColorLight}" Offset="0" /> 
            <GradientStop Color="{DynamicResource ContentAreaColorDark}" Offset="1" /> 
           </LinearGradientBrush> 
          </Border.Background> 
          <Border.BorderBrush> 
           <SolidColorBrush Color="{DynamicResource BorderMediumColor}" /> 
          </Border.BorderBrush> 
          <ContentPresenter x:Name="PART_SelectedContentHost" Margin="4" ContentSource="SelectedContent" /> 
         </Border> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

</Window.Resources> 
<TabControl ItemsSource="{Binding Path=Items}"> 
    <TabControl.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition /> 
        <RowDefinition /> 
       </Grid.RowDefinitions> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition MaxWidth="150" /> 
       </Grid.ColumnDefinitions> 

       <TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding .}" TextAlignment="Center" 
          TextWrapping="Wrap" FontFamily="Open Sans" FontWeight="Regular" FontSize="14" /> 
      </Grid> 
     </DataTemplate> 
    </TabControl.ItemTemplate> 
</TabControl> 

enter image description here

+0

Спасибо за ваш ответ. Он решил мою проблему с небольшими трюками, но для этого не существует более короткого решения? Как '! Important' в CSS. Думаю, должен быть один. –

+0

@NaveedButt AFAIK, стили WPF отличаются от стилей CSS. Они не каскадируют, поэтому к элементу сразу применяется только ** один ** стиль, и он не должен иметь противоречивых атрибутов. ! important в css используется в соединении с каскадом, чтобы дать максимальный вес при возникновении конфликтов. Тем не менее у вас может быть проблема ** [приоритет] (https://msdn.microsoft.com/en-us/library/ms743230.aspx) **, как и у вас, и wpf просто следуют правилам, описанным в ссылка. Btw, ** [здесь] (http://stackoverflow.com/q/16008484/5246145) ** - аналогичный вопрос, но я не думаю, что tecnique лучше – 3615

Смежные вопросы