title: How to get desired height of WPF UI element with current height of 0?
body: <p>My ultimate goal is to animate the change in size between two UserControls. The way that I have attempted to achieve this has produced one major problem.</p>
  
  <p>I start with a DataTemplate that contains some basic text and icon display, an 'edit' UserControl with a height set to 0 and an edit button. The edit UserControl is in a GridRow with Height="Auto", so it also starts out with a height of 0. The button has a DoubleAnimation triggered by the button click that animates the height of the UserControl from 0 to 300. This all works just fine. Here is a simplified code example.</p>
  
  <pre><code>&lt;DataTemplate x:Key="UserTemplate" DataType="{x:Type dataTypes:User}"&gt;
  ...
  &lt;controls:UserView Grid.Row="1" Grid.ColumnSpan="5" x:Name="EditRow" 
      DataContext="{Binding}" Height="0" /&gt;
  &lt;controls:UserEditor Grid.Row="2" Grid.ColumnSpan="5" x:Name="EditRow" 
      DataContext="{Binding}" Height="0" /&gt;
  &lt;Button Grid.Row="0" Grid.Column="4" Name="Edit" Style="{StaticResource ButtonStyle}" 
      ToolTip="Edit user" Click="Button_Click"&gt;
      &lt;Image Source="/SolutionName;component/Images/Edit.png" Stretch="None" /&gt;
      &lt;Button.Triggers&gt;
          &lt;EventTrigger RoutedEvent="Button.Click"&gt;
              &lt;BeginStoryboard&gt;
                  &lt;Storyboard&gt;
                      &lt;DoubleAnimation Name="EditRowHeightAnimation" 
      Storyboard.TargetName="EditRow" Storyboard.TargetProperty="Height" From="0" 
      To="300" Duration="00:00:0.5" /&gt;
                  &lt;/Storyboard&gt;
              &lt;/BeginStoryboard&gt;
          &lt;/EventTrigger&gt;
      &lt;/Button.Triggers&gt;
  &lt;/Button&gt;
  ...
  &lt;/DataTemplate&gt;
  </code></pre>
  
  <p>The problem is that the edit UserControl is not 300 pixels high and I won't know what height it will be at design time. I tried the following, but it doesn't work.</p>
  
  <pre><code>&lt;DoubleAnimation Name="EditRowHeightAnimation" Storyboard.TargetName="EditRow"
      Storyboard.TargetProperty="Height" From="0" To="{Binding DesiredSize.Height, 
      ElementName=EditRow}" Duration="00:00:0.5" /&gt;
  </code></pre>
  
  <p>I have also tried calling Measure() and UpdateLayout() on the edit UserControl from code behind. I commented out the button click trigger and xaml animation and added one from code behind instead... now this kind of worked, but I always got the same (wrong) DesiredSize. That is, the UserControl height would get animated, but just to the wrong height. Here is the button click handler code.</p>
  
  <pre><code>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&lt;ContentPresenter&gt;();
      if (itemDataTemplate != null &amp;&amp; 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);
      }
  }
  </code></pre>
  
  <p>So my question is how can I get the size that a UserControl would be if its container placed no size restriction upon it, when its current height is 0?</p>
  
  <p>I'd also be happy to hear if there is a better way to achieve my ultimate goal. Many thanks in advance.</p>