2010-02-24 5 views
0

У меня есть пользовательский ListBox со следующим стилем ListBoxItem. Он содержит несколько анимаций, чтобы масштабировать ListBoxItem, когда мышь нависает над ним.WPF InvalidateMeasure не вызывается во время или после анимации

<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> 

У меня есть собственная реализация MeasureOverride для моего ListBox, который получает называется и все хорошо, за исключением того, что MeasureOverride не вызывается до ListBoxItem масштабируется, поэтому он просит гораздо меньший размер, чем требуется.

Я попытался вызвать InvalidateMeasure на моем ListBox после завершения анимации, но метод MeasureOverride не запускается. На данный момент я применяю анимацию на Grid в моей контрольной таблице. Не вызывает ли это того, что вызывает MeasureOverride? Как применить те же анимации к самому элементу управления?

ответ

3

RenderTransform изменяет внешний вид элемента, но применяется после завершения макета. Это означает, что использование RenderTransform не несет пропуски макета.

Вместо этого используйте LayoutTransform. Это влияет на меру ...

Надежда это помогает,

Приветствия, Anvaka