Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to get desired height of WPF UI element with current height of 0?
    primarykey
    data
    text
    <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>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload