2013-10-09 55 views
1

我在我的应用程序中有一个资源字典,其中它们是为textblock定义的通用样式,此字典与app.xaml合并。嵌套控件中的重写隐式样式

现在,我已经在那里我需要改变的TabItem的风格在我的对话窗口,并根据一些触发器设置前景色的要求,我已经定义我自己的文字块的风格和写作模板的TabItem和文本块为如下─

/* wriiten in common style */ 
     <Style TargetType="{x:Type TextBlock}"> 
       <Setter Property="Foreground" Value="{StaticResource BR_SE_Black}" /> 
       <Setter Property="TextTrimming" Value="CharacterEllipsis"/> 
       <Setter Property="FontSize" Value="11"/> 
       <Setter Property="FontFamily" Value="Arial Unicode MS"/> 
       <Style.Triggers> 
        <Trigger Property="controls:TextBlockService.IsTextTrimmed" Value="True"> 
         <Setter Property="ToolTip" Value="{Binding Text, RelativeSource={RelativeSource Self}}"/> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 




    /* written in dialog winow */ 
<Style TargetType="{x:Type TextBlock}"> 
      <Setter Property="VerticalAlignment" Value="Center"></Setter> 
      <Setter Property="TextTrimming" Value="CharacterEllipsis"/> 
      <Setter Property="FontSize" Value="11"/> 
      <Setter Property="FontFamily" Value="Arial Unicode MS"/> 
      <Style.Triggers> 
       <Trigger Property="Controls:TextBlockService.IsTextTrimmed" Value="True"> 
        <Setter Property="ToolTip" Value="{Binding Text, RelativeSource={RelativeSource Self}}"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 

     <Style TargetType="{x:Type TabControl}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type TabControl}" > 
         <Grid KeyboardNavigation.TabNavigation="Local"> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="Auto"/> 
           <RowDefinition Height="*"/> 
          </Grid.RowDefinitions> 
          <TabPanel Name="HeaderPanel" Grid.Row="0" Panel.ZIndex="1" Margin="0,0,0,-1" IsItemsHost="True" 
               KeyboardNavigation.TabIndex="1" Background="Green" /> 
          <Border Name="Border" Grid.Row="1" Background="#FFFFFF" BorderBrush="#888888" BorderThickness="1" 
              KeyboardNavigation.TabNavigation="Local" KeyboardNavigation.DirectionalNavigation="Contained" KeyboardNavigation.TabIndex="2" > 
           <ContentPresenter Name="PART_SelectedContentHost" Margin="4" ContentSource="SelectedContent" /> 
          </Border> 
         </Grid> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

     <!-- SimpleStyles: TabItem --> 
     <Style TargetType="{x:Type TabItem}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type TabItem}"> 
         <Grid> 
          <Border Name="Border" Margin="0,0,-4,0" Background="Green" CornerRadius="3" BorderBrush="Transparent" BorderThickness="1,1,1,1" > 
           <ContentPresenter x:Name="ContentSite" VerticalAlignment="Center" HorizontalAlignment="Center" 
                  ContentSource="Header" Margin="12,2,12,2" RecognizesAccessKey="True" /> 
          </Border> 
         </Grid> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsSelected" Value="True"> 
           <Setter Property="Panel.ZIndex" Value="100" /> 
           <Setter TargetName="Border" Property="BorderThickness" Value="1,1,1,0" /> 

           <Setter TargetName="Border" Property="Background" Value="White" /> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
      <Setter Property="Foreground" Value="white"></Setter> 
      <Style.Triggers> 
       <Trigger Property="IsSelected" Value="True"> 
        <Setter Property="Foreground" Value="Green"></Setter> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 

我现在面临的问题是我试图在tabitem标题的tabitem模板中设置的前景颜色没有得到应用,并且它正在采用基本文本块样式中定义的颜色,如果我评论前景颜色,则为 设置基本的文本块样式一切工作正常,任何想法为什么这个问题正在发生,以及如何解决它?

+0

如果在应用程序资源中定义了隐式TextBlock样式,则不能在Window资源下隐式**向下覆盖树,因为[TextBlock](https://msdn.microsoft.com/en-us/ library/system.windows.controls.textblock(v = vs.110).aspx)不能从控制派生 - 请参阅[这里的完整说明...](http://stackoverflow.com/a/9166963/742084) – Cel

回答

6

试着改变你的TabItem的ContentPresenter所以它看起来像下面:

<ContentPresenter 
    x:Name="ContentSite" 
    VerticalAlignment="Center" 
    HorizontalAlignment="Center" 
    ContentSource="Header" 
    Margin="12,2,12,2" 
    RecognizesAccessKey="True"> 
    <ContentPresenter.Resources> 
     <Style 
     TargetType="{x:Type TextBlock}" 
     BasedOn="{x:Null}" /> 
     </ContentPresenter.Resources> 
</ContentPresenter> 

通过向ContentPresenter的资源应该可以挡住自定义样式为ContentPresenter下的所有文本块,并使用默认的样式风格代替。

+0

感谢您的回复,但这不是帮助 – ankush

+0

查看最新的答案。理论是正确的,只是风格错了。 – wdavo