2016-04-08 3 views
0

Я хотел создать TabControl, где все TabItems имеют одинаковый общий вид, но в них есть разные значки. Все мои стили находятся во внешнем словаре ресурсов. В главном окне я объявил свой контроль следующим образом:Стиль не наследуется от другого

<TabControl Grid.Row="2" TabStripPlacement="Left" > 
     <TabItem Style="{StaticResource IconDev}"> 
      <Label Content="Content 1" /> 
     </TabItem> 
     <TabItem Style="{StaticResource IconTab}"> 
      <Label Content="Content 2" /> 
     </TabItem> 
    </TabControl 

А потом я создал два стиля. Во-первых для общего вида с Tab пункта, а затем специально для иконки:

<Style x:Key="IconTab" TargetType="{x:Type TabItem}"> 
    <Setter Property="MinHeight" Value="70"/> 
    <Setter Property="MaxHeight" Value="70"/> 
    <Setter Property="MinWidth" Value="70"/> 
    <Setter Property="MaxWidth" Value="70"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TabItem}"> 
       <Grid> 
        <Border 
         Name="Border" 
         Margin="0,0,-4,0" 
         Background="#FFF" 
         BorderBrush="#FFF" 
         BorderThickness="0" 
         CornerRadius="0" > 
         <ContentPresenter x:Name="ContentSite" 
           VerticalAlignment="Center" 
           HorizontalAlignment="Center" 
           ContentSource="Header" 
           Margin="0" 
           RecognizesAccessKey="True"/> 
        </Border> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="Panel.ZIndex" Value="100" /> 
         <Setter TargetName="Border" Property="Background" Value="#000" /> 
        </Trigger> 
        <Trigger Property="IsEnabled" Value="False"> 
         <Setter TargetName="Border" Property="Background" Value="#000" /> 
         <Setter TargetName="Border" Property="BorderBrush" Value="#000"/> 
         <Setter Property="Foreground" Value="#000"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
<Style x:Key="IconDev" TargetType="{x:Type TabItem}" BasedOn="{StaticResource IconTab}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate> 
       <TabItem> 
        <TabItem.Header> 
         <StackPanel> 
          <Viewbox Width="50" Height="50"> 
           <Frame Source="icon-dev.xaml" /> 
          </Viewbox> 
         </StackPanel> 
        </TabItem.Header> 
       </TabItem> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Однако что-то не очень хорошо работает с наследованием, поскольку Style="{StaticResource IconDev}" вставляет только значок, но он не применяет общий макет, указанный в Style="{StaticResource IconTab}". Что я делаю неправильно?

+0

'IconDev' должен примените установку Min/Max (наследуйте от базового стиля). Он также перезагружает (переопределяет) шаблон TabItem. так что не так? – ASh

+0

Прежде всего он не применяет триггеры из «IconTab», у него есть вкладка «По умолчанию» с иконкой внутри. Во-вторых, это не работает. При нажатии на нее не будет переключаться вкладка. Но он применяет размер так же, как вы сказали – przemoo83

+0

'IconDev' tempate стирает шаблон, написанный в' IconTab', и не имеет триггеров. Средство настройки размеров не зависит от шаблона setter, и они работают – ASh

ответ

2

IconDev должен применять минимальный/максимальный размер (наследовать от базового стиля). Он также сбрасывает (отменяет, стирает) шаблон TabItem. В новом шаблоне нет триггеров. Размер сеттеры не зависят от шаблона сеттера, и они работают

содержание заголовка

Tab для одной вкладки можно изменить снаружи, а не в шаблоне

Э.Г. как TabItem использовать IconTab стиль, первая закладка имеет сложное содержимое заголовка

<TabControl TabStripPlacement="Left" > 
    <TabItem Style="{StaticResource IconTab}"> 
     <!--Label is a tab content--> 
     <Label Content="Content 1" /> 

     <TabItem.Header> 
      <StackPanel> 
       <Viewbox Width="50" Height="50"> 
        <Frame Source="icon-dev.xaml" /> 
       </Viewbox> 
      </StackPanel> 
     </TabItem.Header> 
    </TabItem> 

    <TabItem Style="{StaticResource IconTab}" Header="Text"> 
     <Label Content="Content 2" /> 
    </TabItem> 
</TabControl> 

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

<Style x:Key="IconDev" TargetType="{x:Type TabItem}" BasedOn="{StaticResource IconTab}"> 
    <Setter Property="Header"> 
     <Setter.Value> 
       <StackPanel> 
        <Viewbox Width="50" Height="50"> 
         <Frame Source="icon-dev.xaml" /> 
        </Viewbox> 
       </StackPanel> 
     </Setter.Value> 
    </Setter> 
</Style> 
<TabControl TabStripPlacement="Left" > 
    <TabItem Style="{StaticResource IconDev}"> 
     <Label Content="Content 1" />     
    </TabItem> 
    <TabItem Style="{StaticResource IconTab}" Header="Text"> 
     <Label Content="Content 2" /> 
    </TabItem> 
</TabControl> 
+0

Так я и сделал это раньше, но хотел сделать его более элегантным и сделать все в файле внешнего стиля. Спасибо – przemoo83

+0

@ przemoo83, пожалуйста, проверьте мое обновление. – ASh

+0

Вы - отличная помощь. Я, наконец, начинаю понимать, как работает этот механизм. – przemoo83