Réaliser une animation "glisser vers le bas" dans WPF

Je cherche à créer mon propre modèle pour un Expander de contrôle. Lorsque le contrôle est étendu, je veux que le contenu de glisser vers le bas lentement.

La hauteur désirée pour le contenu n'est pas connu au moment de la compilation.

Je pensais que l'on pouvait définir le glisser vers le bas comme une animation:

<Storyboard x:Key="ExpandContent">

    <DoubleAnimation 
        Storyboard.TargetName="_expanderContent" 
        Storyboard.TargetProperty="Height" 
        From="0.0" 
        To="{Binding ElementName=_expanderContent,Path=DesiredHeight}"
        Duration="0:0:1.0" />
</Storyboard>

Mais Malheureusement pas. Nous obtenons une erreur

Ne risque pas de geler ce Storyboard montage de l'arbre pour une utilisation dans les threads.

Il semble que nous ne pouvons pas utiliser de liaison lors de la définition des paramètres d'animation. (Discuté aussi dans cette question.)

Quelqu'un a une idée sur comment je peux approche? Je suis méfier de l'utilisation de LayoutTransform.ScaleYparce que ce serait de créer une image déformée.

Ceci est similaire à cette questionmais cette question a une réponse qui a participé à l'écriture de code-behind, je ne pense pas possible dans un modèle de contrôle.
Je me demande si un XAML solution est réalisable.


Pour ce que ça vaut, ici, c'est l'état actuel de mon modèle de contrôle.

<ControlTemplate x:Key="ExpanderControlTemplate"  TargetType="{x:Type Expander}">
<ControlTemplate.Resources>
<!-- Here are the storyboards which don't work -->
<Storyboard x:Key="ExpandContent">
<DoubleAnimation 
Storyboard.TargetName="_expanderContent" 
Storyboard.TargetProperty="Height" 
From="0.0" 
To="{Binding ElementName=_expanderContent,Path=DesiredHeight}"
Duration="0:0:1.0" />
</Storyboard>
<Storyboard x:Key="ContractContent">
<DoubleAnimation 
Storyboard.TargetName="_expanderContent" 
Storyboard.TargetProperty="Height" 
From="{Binding ElementName=_expanderContent,Path=DesiredHeight}"
To="0.0"
Duration="0:0:1.0" />
</Storyboard>
</ControlTemplate.Resources>
<Grid Name="MainGrid" Background="White">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Name="ContentRow" Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ContentPresenter ContentSource="Header" />
<ToggleButton Template="{StaticResource ProductButtonExpand}"
Grid.Column="1"
IsChecked="{Binding Path=IsExpanded,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent}}" 
/>
<Rectangle Grid.ColumnSpan="2" Fill="#FFDADADA" Height="1" Margin="8,0,8,2" VerticalAlignment="Bottom"/>
</Grid>
</Border>
<ContentPresenter Grid.Row="1" HorizontalAlignment="Stretch" Name="_expanderContent">
</ContentPresenter>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsExpanded" Value="True">
<Setter TargetName="_expanderContent" Property="Height" Value="{Binding ElementName=_expanderContent,Path=DesiredHeight}" />
<!-- Here is where I would activate the storyboard if they did work -->
<Trigger.EnterActions>
<!--<BeginStoryboard Storyboard="{StaticResource ExpandContent}"/>-->
</Trigger.EnterActions>
<Trigger.ExitActions>
<!--<BeginStoryboard x:Name="ContractContent_BeginStoryboard" Storyboard="{StaticResource ContractContent}"/>-->
</Trigger.ExitActions>
</Trigger>
<Trigger Property="IsExpanded" Value="False">
<Setter TargetName="_expanderContent" Property="Height" Value="0" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>

source d'informationauteur Andrew Shepherd