2010-02-24 5 views
0

J'ai un ListBox personnalisé avec le style ListBoxItem suivant. Il contient quelques animations pour mettre à l'échelle le ListBoxItem lorsque la souris le survole.WPF InvalidateMeasure non appelé pendant ou après l'animation

<Style x:Key="notesListBoxStyle" TargetType="{x:Type ListBoxItem}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
       <Grid x:Name="gridItem" 
          Background="LemonChiffon" 
          Height="100" 
          Width="100" 
          RenderTransformOrigin="{TemplateBinding RenderTransformOrigin}"> 
        <Grid.RenderTransform> 
         <ScaleTransform ScaleX="1.0" 
             ScaleY="1.0"/> 
        </Grid.RenderTransform> 
        <Grid.LayoutTransform> 
         <RotateTransform Angle="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}, AncestorLevel=1}, Converter={StaticResource listIndexConverter}, ConverterParameter='Rotate'}"/> 
        </Grid.LayoutTransform> 
        <Border BorderBrush="DarkGoldenrod" BorderThickness="2" Margin="2"> 
         <ContentPresenter HorizontalAlignment="Stretch" 
              SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
              VerticalAlignment="Stretch"/> 
        </Border> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <EventTrigger RoutedEvent="ListBoxItem.MouseEnter"> 
         <BeginStoryboard Name="showItemStoryboard"> 
          <Storyboard > 
           <DoubleAnimation Storyboard.TargetName="gridItem" 
               Storyboard.TargetProperty="RenderTransform.ScaleX" 
               From="1.0" 
               To="1.5" 
               Duration="0:0:0.3"/> 
           <DoubleAnimation Storyboard.TargetName="gridItem" 
               Storyboard.TargetProperty="RenderTransform.ScaleY" 
               From="1.0" 
               To="1.5" 
               Duration="0:0:0.3"/> 
           <DoubleAnimation Storyboard.TargetName="gridItem" 
               Storyboard.TargetProperty="Width" 
               From="100" 
               To="400" 
               Duration="0:0:0.3"/> 
           <DoubleAnimation Storyboard.TargetName="gridItem" 
               Storyboard.TargetProperty="Height" 
               From="100" 
               To="200" 
               Duration="0:0:0.3"/> 
           <DoubleAnimation Storyboard.TargetName="gridItem" 
               Storyboard.TargetProperty="LayoutTransform.Angle" 
               To="0" 
               Duration="0:0:0.3"/> 
          </Storyboard> 
         </BeginStoryboard> 
        </EventTrigger> 
        <EventTrigger RoutedEvent="ListBoxItem.MouseLeave"> 
         <StopStoryboard BeginStoryboardName="showItemStoryboard"/> 
        </EventTrigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

J'ai ma propre mise en œuvre de MeasureOverride pour mon ListBox qui est appelée et tout va bien, sauf que MeasureOverride n'est pas appelé avant la ListBoxItem est mis à l'échelle, il demande une taille beaucoup plus petite que ce qui est nécessaire.

J'ai essayé d'appeler InvalidateMeasure sur ma ListBox une fois l'animation terminée, mais la méthode MeasureOverride n'est pas déclenchée. Au moment où j'applique les animations sur la Grille dans mon ControlTemplate, est-ce que ce qui fait que MeasureOverride ne soit pas appelé? Comment appliquer les mêmes animations sur le contrôle lui-même? RenderTransform modifie l'aspect de l'élément mais est appliqué après la fin de la passe de la mise en page.

Répondre

3

Cela signifie que l'utilisation d'un RenderTransform n'entraîne pas de passage de mise en page. En revanche, utilisez LayoutTransform. Il ne touche mesure ...

Hope this helps,

Cheers, Anvaka

Questions connexes