如何获得WPF UI元素所需高度为0当前高度? [英] How to get desired height of WPF UI element with current height of 0?
问题描述
我的最终目标是动画2用户控件之间的尺寸变化。我试图实现这一目标的方式产生了一个主要的问题。
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.
我开始与包含一些基本的文本和图标显示,具有设置为0的高度和编辑按钮的编辑用户控件一个DataTemplate。编辑用户控件是随高度=自动一GridRow,所以它也开始了为0的高度的按钮有由按钮点击该动画从0用户控件的高度,以300这所有的作品引发了DoubleAnimation是正好。下面是一个简化code的例子。
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.
<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>
问题是,编辑用户控件是不是300像素高,我不知道这将是在设计时什么高度。我尝试以下,但它不工作。
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.
<DoubleAnimation Name="EditRowHeightAnimation" Storyboard.TargetName="EditRow"
Storyboard.TargetProperty="Height" From="0" To="{Binding DesiredSize.Height,
ElementName=EditRow}" Duration="00:00:0.5" />
我也尝试从code后面的编辑用户控件调用测量()和UpdateLayout请()。我注释掉按钮点击触发和XAML动画和增加了一个从code,而不是...现在这种落后的工作,但我总是得到相同的(错误)DesiredSize。也就是说,该用户控件高度将得到的动画,但只是到错误的高度。这里是按钮单击处理程序code。
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.
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);
}
}
所以我的问题是如何才能得到大小,一个用户控件是如果它的容器中放入没有大小限制,那么,当其目前的高度为0?
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?
我也很乐意听到的话,有一个更好的方式来实现我的终极目标。提前很多感谢。
I'd also be happy to hear if there is a better way to achieve my ultimate goal. Many thanks in advance.
推荐答案
您可以把你想要的大小成画布内容
与 ClipToBound =真
。然后,你可以操纵画布
,但在画布里面的内容的大小
将永远是其全部的规模所需尺寸。
You can put the content you want the size of into a Canvas
with ClipToBound="True"
. Then you can manipulate the size of the Canvas
and yet the size of the content inside the Canvas
will always be its full desired size.
这篇关于如何获得WPF UI元素所需高度为0当前高度?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!