在没有所有孩子“跳跃”的情况下调整WPF UserControl的大小

时间:2011-02-23 20:09:23

标签: .net wpf user-interface animation storyboard

有没有办法调整WPF UserControl的大小,使子控件不会失败?

我有这个故事板:

<Storyboard>
    <DoubleAnimation Storyboard.TargetProperty="Height" Storyboard.TargetName="MyUserControl" To="145" From="0" Duration="0:0:1" />
</Storyboard>

这很有效;它取决于我从高度零到高度145的控制 - 问题是当高度属性发生变化时,由于其Horizo​​ntalAlignment和VerticalAlighment属性,我怀疑里面的所有子控件开始跳转。有没有办法可以在动画结束前禁用它?

我正在尝试创建这个UserControl“幻灯片”进入视图的错觉 - 所以如果我发生这种错误,我会对其他方法持开放态度。

3 个答案:

答案 0 :(得分:5)

一切都在“跳跃”,因为每次更改控件的Height时,所有包含的控件都会根据新的可用空间重新定位。

要达到预期效果,您应该使用RenderTransform而不是更改控件的实际Height

以下是如何做到这一点。首先,在您的控件上添加ScaleTransform作为RenderTransform属性的值:

<MyUserControl.RenderTransform>
    <ScaleTransform ScaleY="0" />
</MyUserControl.RenderTransform>

然后,修改动画的目标属性以更改变换的ScaleY属性:

<Storyboard>
    <DoubleAnimation Storyboard.TargetProperty="RenderTransform.(ScaleTransform.ScaleY)" Storyboard.TargetName="MyUserControl" To="145" Duration="0:0:1" />
</Storyboard>

<强>更新

实现幻灯片到视图效果的另一种方法是使用TranslateTransform,其值为Y

<MyUserControl.RenderTransform>
   <TranslateTransform Y="-1000" />
</MyUserControl.RenderTransform>

然后,将其Y属性设为0:

<Storyboard>
    <DoubleAnimation Storyboard.TargetProperty="RenderTransform.(TranslateTransform.Y)" Storyboard.TargetName="MyUserControl" To="0" Duration="0:0:1" />
</Storyboard>

答案 1 :(得分:1)

当您为Height或Width设置动画时,UserControl也会告诉其子项重新调整,这就是布局系统在WPF中的工作方式。 “跳跃”将取决于您使用的布局类型(网格,StackPanel等)。

但是看起来,对于您的场景,最好使用RenderTransform ScaleTransform ScaleY动画而不是动画高度。 Rendertransform不会干扰UserControl的布局安排。

答案 2 :(得分:0)

要添加到Pavlov的更新答案,我不得不使用空白的CompositeTransform。也许是因为使用了最新的Blend for Visual Studio 2012更新1,但这有效(针对Windows Phone 8):

    <MyUserControl.RenderTransform>
        <CompositeTransform />
    </MyUserControl.RenderTransform>