2010-01-06 3 views
0

J'implémente mon propre faux TabControl pour ressembler à des onglets IE8 (je connais d'autres implémentations de tabcontrol).Déclenchement dans le modèle provoque un mauvais rendu

Mon TabControl dérive de Selector, et mes TabItem s dérivent de ContentControl. Lorsqu'un onglet est sélectionné, j'ai défini IsSelected (une propriété dependency) sur true. Mon Trigger ressemble à ceci:

<Trigger Property="IsSelected" Value="true"> 
    <Setter Property="Margin" Value="0,0,0,0"/> 
</Trigger> 

La marge par défaut pour mon TabItem est 0,2,0,0. En d'autres termes, TabItem non sélectionné doit avoir un léger décalage par rapport à la sélection. J'ai essayé de faire cela en inverse, et en utilisant la hauteur à la place. Le résultat est que TabItem s sélectionnés semblent être coupés au lieu de modifier la marge. Je reçois le bon visuel lorsque la propriété est définie sur l'étiquette directement, i.e. .:

<local:TabItem IsSelected="true"/> 

J'ai essayé Arrange invalidant, Visual et Measure dans ma propriété IsSelected de dépendance sans beaucoup de succès.

Qu'est-ce qui me manque ici?

Edit:

est ici le style complet pour le TabItem (le style est en partie basé sur ce projet: http://www.codeproject.com/KB/WPF/WpfTabControl.aspx):

<Style TargetType="{x:Type local:TabItem}"> 
    <Setter Property="Background" Value="{Binding Path=TabItemNormalBackground, RelativeSource={RelativeSource Self}}"/> 
    <Setter Property="SnapsToDevicePixels" Value="True"/> 
    <Setter Property="Height" Value="26"/> 
    <Setter Property="Margin" Value="0,2,0,0"/> 
    <Setter Property="HorizontalAlignment" Value="Stretch" /> 
    <Setter Property="VerticalAlignment" Value="Bottom" /> 
    <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
    <Setter Property="VerticalContentAlignment" Value="Center" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:TabItem}"> 
       <Border CornerRadius="3,3,0,0" 
         Background="{TemplateBinding Background}" 
         BorderBrush="{StaticResource TabItemOuterBorderBrush}" 
         BorderThickness="1,1,1,0"> 
        <Border CornerRadius="3,3,0,0" 
         Background="{TemplateBinding Background}" 
         BorderBrush="{StaticResource TabItemInnerBorderBrush}" 
         BorderThickness="1,1,1,0"> 
         <Grid HorizontalAlignment="Stretch"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="Auto"/> 
           <ColumnDefinition Width="*"/> 
           <ColumnDefinition Width="Auto"/> 
          </Grid.ColumnDefinitions> 
          <ContentPresenter Grid.Column="0" Content="{TemplateBinding Icon}" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
          <ContentPresenter Grid.Column="1" 
            SnapsToDevicePixels="True" 
            HorizontalAlignment="Stretch" 
            VerticalAlignment="Center" 
            RecognizesAccessKey="True"/> 
          <Button x:Name="PART_CloseButton" 
          Grid.Column="2" 
          VerticalAlignment="Center" 
          HorizontalAlignment="Center" 
          Margin="5,0,5,0" 
          Style="{StaticResource CloseButtonStyle}" 
          Visibility="Collapsed" 
          /> 
         </Grid> 

        </Border> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsSelected" Value="true"> 
         <Setter Property="Background" Value="{Binding Path=TabItemSelectedBackground, RelativeSource={RelativeSource Self}}"/> 
         <Setter Property="Margin" Value="0,0,0,0"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

Il est vraiment difficile de répondre sans voir le code de disposition complet en XAML. –

+0

J'ai ajouté le TabItem ci-dessus. J'espère que ça suffit. – risingape

Répondre

0

de Nevermind. J'ai stocké les tabitems désiré dans MeasureOverride, et j'ai oublié de les effacer dans les appels suivants.

Questions connexes