2010-02-24 34 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爲我的列表框都會調用,一切都很好,除了ListBoxItem中被縮放之前的MeasureOverride不叫,所以它要求比所需的尺寸要小得多。

我已經嘗試在動畫完成後調用ListBox上的InvalidateMeasure,但未觸發MeasureOverride方法。目前我正在ControlTemplate中的網格上應用動畫,這是什麼導致MeasureOverride不被調用?我如何在控件本身上應用相同的動畫?

回答

3

RenderTransform修改元素的外觀,但在佈局過程完成後應用。這意味着使用RenderTransform不會產生布局傳遞。

取而代之,使用LayoutTransform。它會影響測量...

希望這有助於

乾杯,Anvaka