2010-08-12 5 views
2

Я пытаюсь создать стиль управления вкладками, который в основном выглядит как кнопки вверху, которые расположены по центру и панель содержимого ниже, которая отображает содержимое tabitem.WPF TabControl Templates + ItemContainerStyle

У меня есть несколько новых шаблонов, но то, что я до сих пор работает очень хорошо, кроме одного. Я хочу иметь возможность устанавливать цвет фона по умолчанию для текстовых элементов. Обычно я это делаю, используя ContentPresenter с элементами зависимостей. Так что-то вроде этого.

<ContentPresenter TextElement.Foreground="White"/> 

В основном это означает, что любой элемент управления TextElement, написанный этим Presenter, наследует это свойство.

Теперь я пытаюсь сделать то же самое, но это не работает! Я считаю, что это связано с тем, что мой стиль ошибочен.

Стиль:

<Style x:Key="MainMenuTab" TargetType="{x:Type TabControl}"> 



     <Setter Property="Template"> 
      <Setter.Value> 

       <ControlTemplate TargetType="{x:Type TabControl}"> 

        <Grid KeyboardNavigation.TabNavigation="Local" Width="{TemplateBinding Width}"> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="Auto"/> 
          <RowDefinition Height="*"/> 
         </Grid.RowDefinitions> 

         <!-- Tab Headers Panel --> 
         <Grid Grid.Row="0" Background="{StaticResource Brush_ApplicationTabBackground}"> 

          <TabPanel 
           Name="HeaderPanel" 
           Grid.Row="0" 
           Panel.ZIndex="1" 
           HorizontalAlignment="Center" 
           VerticalAlignment="Center" 
           IsItemsHost="True" 
           KeyboardNavigation.TabIndex="1" 
           Background="{StaticResource Brush_ApplicationTabBackground}" 
           > 


          </TabPanel> 


         </Grid> 



         <!-- Tab Body --> 
         <Border 
          Name="Border" 
          Grid.Row="1" 
          Background="{StaticResource Brush_ApplicationBackground}" 
          BorderBrush="Transparent" 
          BorderThickness="1" 
          CornerRadius="2" 
          KeyboardNavigation.TabNavigation="Local" 
          KeyboardNavigation.DirectionalNavigation="Contained" 
          KeyboardNavigation.TabIndex="2" > 

          <ContentPresenter 
           Name="PART_SelectedContentHost" 
           Margin="4" 
           ContentSource="SelectedContent" /> 
         </Border> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 




     <!-- Each Tab should look like this --> 
     <Setter Property="ItemContainerStyle"> 
      <Setter.Value> 
       <Style> 

        <Setter Property="Control.Template"> 
         <Setter.Value> 

          <ControlTemplate TargetType="{x:Type TabItem}"> 

           <Grid Background="{StaticResource Brush_ApplicationTabBackground}"> 
            <Border Width="50" x:Name="BorderTab" Height="50" Margin="5" BorderThickness="1" ClipToBounds="True" BorderBrush="Transparent" Background="Transparent" CornerRadius="5"> 
             <Rectangle x:Name="BackgroundRec" Fill="Transparent" Stroke="Transparent" Width="50" Height="50" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
            </Border> 
            <ContentPresenter Name="TheHeaderContentPresenter" Width="50" Height="50" Margin="5" ContentSource="Header" HorizontalAlignment="Center" VerticalAlignment="Center" TextElement.Foreground="White"/> 
           </Grid> 

           <ControlTemplate.Triggers> 
            <Trigger Property="IsSelected" Value="True"> 
             <Trigger.Setters> 
              <Setter TargetName="BorderTab" Property="BorderBrush" Value="{StaticResource Brush_ApplicationTabHighlight}"/> 
              <Setter TargetName="BorderTab" Property="BorderThickness" Value="3"/> 
              <Setter TargetName="BackgroundRec" Property="Fill" Value="{StaticResource Brush_ApplicationTabHighlight}"/> 
              <Setter Property="Panel.ZIndex" Value="1"/> 
             </Trigger.Setters> 
            </Trigger> 

            <Trigger Property="IsSelected" Value="False"> 
             <Trigger.Setters> 
              <Setter TargetName="BorderTab" Property="BorderBrush" Value="{StaticResource Brush_ApplicationTabBackground}"/> 
              <Setter TargetName="BorderTab" Property="BorderThickness" Value="0"/> 
              <Setter TargetName="BackgroundRec" Property="Fill" Value="{StaticResource Brush_ApplicationTabBackground}"/> 
             </Trigger.Setters> 
            </Trigger> 
           </ControlTemplate.Triggers> 

          </ControlTemplate> 

         </Setter.Value> 
        </Setter> 

       </Style> 
      </Setter.Value> 
     </Setter> 

В моей ContentPresenter под ItemContainerStyle имеет свойство TextElement.Foreground = "White", но он не будет печатать белый текст!

Мой TabControl, который использует этот стиль выглядит следующим образом:

<TabControl Grid.Row="2" Style="{StaticResource MainMenuTab}"> 


      <TabItem> 
       <TabItem.Header> 
        <TextBlock VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="0,0,0,5" Text="{x:Static UIStrings:ClientStrings.MainWindow_TabHeader_SingleWaveLength}"></TextBlock> 
       </TabItem.Header> 
       <TextBlock>TEST PANEL</TextBlock> 


     </TabItem> 
</TabControl> 

Я знаю, что это compicated, но я действительно люблю эту работу.

ответ

3

Решение найдено.

Основываясь на сообщении HCL, я нашел решение. Я испытываю ту же самую проблему, я пытаюсь, чтобы контент-презентатор задал свойство унаследованной зависимости. вместо этого я просто указываю шаблону применить свойство зависимостей, таким образом, каждый табитум имеет такое свойство и поэтому устанавливает его для всех его дочерних элементов.

<Setter Property="ItemContainerStyle"> 
    <Setter.Value> 
     <Style TargetType="TabItem"> 

      <Setter Property="TextElement.Foreground" Value="White"/> 

      <Setter Property="Template"> 
       <Setter.Value> 

        <ControlTemplate TargetType="{x:Type TabItem}"> 

         <Grid Background="{StaticResource Brush_ApplicationTabBackground}"> 
          <Border Width="50" x:Name="BorderTab" Height="50" Margin="5" BorderThickness="1" ClipToBounds="True" BorderBrush="Transparent" Background="Transparent" CornerRadius="5"> 
           <Rectangle x:Name="BackgroundRec" Fill="Transparent" Stroke="Transparent" Width="50" Height="50" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
          </Border> 
          <ContentPresenter Name="TheHeaderContentPresenter" Width="50" Height="50" Margin="5" ContentSource="Header" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
         </Grid> 

         <ControlTemplate.Triggers> 
          <Trigger Property="IsSelected" Value="True"> 
           <Trigger.Setters> 
            <Setter TargetName="BorderTab" Property="BorderBrush" Value="{StaticResource Brush_ApplicationTabHighlight}"/> 
            <Setter TargetName="BorderTab" Property="BorderThickness" Value="3"/> 
            <Setter TargetName="BackgroundRec" Property="Fill" Value="{StaticResource Brush_ApplicationTabHighlight}"/> 
            <Setter Property="Panel.ZIndex" Value="1"/> 
           </Trigger.Setters> 
          </Trigger> 

          <Trigger Property="IsSelected" Value="False"> 
           <Trigger.Setters> 
            <Setter TargetName="BorderTab" Property="BorderBrush" Value="{StaticResource Brush_ApplicationTabBackground}"/> 
            <Setter TargetName="BorderTab" Property="BorderThickness" Value="0"/> 
            <Setter TargetName="BackgroundRec" Property="Fill" Value="{StaticResource Brush_ApplicationTabBackground}"/> 
           </Trigger.Setters> 
          </Trigger> 
         </ControlTemplate.Triggers> 

        </ControlTemplate> 

       </Setter.Value> 
      </Setter> 

     </Style> 
    </Setter.Value> 
</Setter> 

Все, что я действительно не добавляется строка:

<Setter Property="TextElement.Foreground" Value="White"/> 

Перед шаблона управления! Также я взял белый текст из презентатора контента, потому что он бесполезен.

+0

Просто краткое примечание. Это в конечном итоге (в моем случае) устанавливает стиль шрифта для ВСЕХ TabItem, а не только для заголовка. Я работаю над исправлением этого. –

2

Проверить этот пост, он смотрит на меня, как это тот же самый эффект:

ContentPresenter within ControlTemplate cannot change attached dependency property

+0

Вы близко. Этот пост дал мне некоторое представление о том, почему это не работает. Это то же самое, что и я. Смотрите ниже для моего решения! –