2011-04-07 113 views
10

任何人都可以帮助我动画WPF DataGrid行的详细信息,当它打开和关闭(例如,幻灯片打开时像一个手风琴,当行选择和幻灯片关闭时,行未被选中)?我需要一个简单的概念证明。动画WPF DataGrid行详细信息

在此先感谢您的帮助:)

+0

我更新了我的答案,它现在有一个关闭动画。 – 2011-04-13 00:39:40

回答

12

冗长,但工作原理:

<DataGrid.RowStyle> 
    <Style TargetType="{x:Type DataGridRow}"> 
     <Setter Property="DetailsVisibility" Value="Collapsed"/> 
     <Style.Triggers> 
      <Trigger Property="IsSelected" Value="True"> 
       <Trigger.EnterActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="DetailsVisibility"> 
           <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Visible}"/> 
          </ObjectAnimationUsingKeyFrames> 
         </Storyboard> 
        </BeginStoryboard> 
       </Trigger.EnterActions> 
       <Trigger.ExitActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="DetailsVisibility"> 
           <DiscreteObjectKeyFrame KeyTime="0:0:0.4" Value="{x:Static Visibility.Collapsed}"/> 
          </ObjectAnimationUsingKeyFrames> 
         </Storyboard> 
        </BeginStoryboard> 
       </Trigger.ExitActions> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</DataGrid.RowStyle> 
<DataGrid.RowDetailsTemplate> 
    <DataTemplate> 
     <Grid> 
      <Grid.LayoutTransform> 
       <ScaleTransform ScaleY="0"/> 
      </Grid.LayoutTransform> 
      <Grid.Style> 
       <Style TargetType="Grid"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=DataGridRow}}" 
            Value="True"> 
          <DataTrigger.EnterActions> 
           <BeginStoryboard> 
            <Storyboard> 
             <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="LayoutTransform.ScaleY"> 
              <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="1"> 
               <EasingDoubleKeyFrame.EasingFunction> 
                <CubicEase EasingMode="EaseInOut" /> 
               </EasingDoubleKeyFrame.EasingFunction> 
              </EasingDoubleKeyFrame> 
             </DoubleAnimationUsingKeyFrames> 
            </Storyboard> 
           </BeginStoryboard> 
          </DataTrigger.EnterActions> 
          <DataTrigger.ExitActions> 
           <BeginStoryboard> 
            <Storyboard> 
             <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="LayoutTransform.ScaleY"> 
              <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="0"> 
               <EasingDoubleKeyFrame.EasingFunction> 
                <CubicEase EasingMode="EaseInOut" /> 
               </EasingDoubleKeyFrame.EasingFunction> 
              </EasingDoubleKeyFrame> 
             </DoubleAnimationUsingKeyFrames> 
            </Storyboard> 
           </BeginStoryboard> 
          </DataTrigger.ExitActions> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Grid.Style> 
      <Grid.Children> 
       <TextBlock Text="Lorem ipsum dolor sit"/> 
      </Grid.Children> 
     </Grid> 
    </DataTemplate> 
</DataGrid.RowDetailsTemplate> 

编辑:通过照顾DetailsVisibilityRowStyle返回动画现在工作太多手动。

请注意,一旦细节被折叠,DataGrid的高度不会缩小,这可能有点问题。这是VirtualizingStackPanel的一个已知问题,如果你能负担得起,你可以将DataGrid.ItemsPanel更改为正常的StackPanel(如果你有很多数据,这将大大减慢应用程序,因为每一行都将立即创建,即使不是可见)。

另外:按Ctrl + A非常有趣。