如何获得WPF UI元素所需高度为0当前高度? [英] How to get desired height of WPF UI element with current height of 0?

查看:480
本文介绍了如何获得WPF UI元素所需高度为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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆