Como obter a altura desejada do elemento de interface do usuário do WPF com a altura atual de 0?

Meu objetivo final é animar a mudança de tamanho entre dois UserControls. A maneira que eu tentei conseguir isso produziu um grande problema.

Começo com um DataTemplate que contém alguns textos básicos e exibição de ícones, um UserControl 'edit' com uma altura definida como 0 e um botão de edição. A edição do UserControl está em um GridRow com Height = "Auto", portanto, também começa com uma altura de 0. O botão tem uma DoubleAnimation acionada pelo clique no botão que anima a altura do UserControl de 0 a 300. Isso tudo funciona bem. Aqui está um exemplo de código simplificado.

<DataTemplate x:Key="UserTemplate" DataType="{x:Type dataTypes:User}">
...
<controls:UserView Grid.Row="1" Grid.ColumnSpan="5" x:Name="EditRow" 
    DataContext="{Binding}" Height="0" />
<controls:UserEditor Grid.Row="2" Grid.ColumnSpan="5" x:Name="EditRow" 
    DataContext="{Binding}" Height="0" />
<Button Grid.Row="0" Grid.Column="4" Name="Edit" Style="{StaticResource ButtonStyle}" 
    ToolTip="Edit user" Click="Button_Click">
    <Image Source="/SolutionName;component/Images/Edit.png" Stretch="None" />
    <Button.Triggers>
        <EventTrigger RoutedEvent="Button.Click">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation Name="EditRowHeightAnimation" 
    Storyboard.TargetName="EditRow" Storyboard.TargetProperty="Height" From="0" 
    To="300" Duration="00:00:0.5" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Button.Triggers>
</Button>
...
</DataTemplate>

O problema é que a edição do UserControl não tem 300 pixels de altura e não saberei qual a altura em tempo de design. Eu tentei o seguinte, mas não funciona.

<DoubleAnimation Name="EditRowHeightAnimation" Storyboard.TargetName="EditRow"
    Storyboard.TargetProperty="Height" From="0" To="{Binding DesiredSize.Height, 
    ElementName=EditRow}" Duration="00:00:0.5" />

Eu também tentei chamar Measure () e UpdateLayout () na edição UserControl do código por trás. Eu comentei o botão, clique em gatilho e animação xaml e adicionei um do código por trás ... agora isso funcionou, mas eu sempre obtive o mesmo (errado) DesiredSize. Ou seja, a altura do UserControl seria animada, mas exatamente na altura errada. Aqui está o código do manipulador de cliques do botão.

private void Button_Click(object sender, RoutedEventArgs e)
{
    User currentUser = (User)CollectionViewSource.GetDefaultView(Users).CurrentItem;
    ListBoxItem listBoxItem = (ListBoxItem)
        (UsersListBox.ItemContainerGenerator.ContainerFromItem(currentUser));
    DataTemplate itemDataTemplate = FindResource("UserTemplate") as DataTemplate;
    ContentPresenter contentPresenter = listBoxItem.GetInternal<ContentPresenter>();
    if (itemDataTemplate != null && contentPresenter != null)
    {
        UserEditor userEditor = (UserEditor)itemDataTemplate.FindName("EditRow", 
            contentPresenter);
        userEditor.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
        userEditor.UpdateLayout();
        userEditor.BeginAnimation(HeightProperty, new DoubleAnimation(0, 
            userEditor.DesiredSize.Height, new Duration(new TimeSpan(0, 0, 1)), 
            FillBehavior.HoldEnd), HandoffBehavior.Compose);
    }
}

Portanto, minha pergunta é como posso obter o tamanho que um UserControl seria se seu contêiner não colocasse nenhuma restrição de tamanho, quando sua altura atual é 0?

Eu também ficaria feliz em saber se existe uma maneira melhor de alcançar meu objetivo final. Muito obrigado antecipadamente.

questionAnswers(2)

yourAnswerToTheQuestion