动画网格的高度在Windows Phone 8.1中没有“运行”

时间:2014-10-04 13:30:51

标签: c# wpf xaml windows-phone-8.1

我试图创建一个简单的动画,其中网格从0高度动画设置为320.(这将产生幻灯片感觉),同时还可以从0-1和背面动画不透明度。

我创建了两个故事板并给了他们一个名字,这里是:

<Page.Resources>
    <Storyboard x:Name="OpenSettings" Storyboard.TargetName="SettingGrid">
        <DoubleAnimation Storyboard.TargetProperty="Height" Storyboard.TargetName="SettingGrid" To="320"/>
        <DoubleAnimation Storyboard.TargetProperty="Opacity" Storyboard.TargetName="SettingGrid" To="1"/>
    </Storyboard>
    <Storyboard x:Name="CloseSettings">
        <DoubleAnimation Storyboard.TargetProperty="Height" Storyboard.TargetName="SettingGrid" To="0"/>
        <DoubleAnimation Storyboard.TargetProperty="Opacity" Storyboard.TargetName="SettingGrid" To="0"/>
    </Storyboard>
</Page.Resources>

我尝试从代码隐藏中运行动画,如下所示:

private void AppBarButton_Click(object sender, RoutedEventArgs e)
    {
        if (settingsOpened)
        {

            CloseSettings.Begin();
            settingsOpened = false;
        }
        else
        {
            OpenSettings.Begin();
            settingsOpened = true;
        }

    }
bool settingsOpened = false;

问题在于高度双重动画。它不会改变网格上的任何高度值。顺便说一下,Opacity动画效果很好。

有谁知道我怎么能解决这个问题?

这也是我试图制作动画的网格。注意我是如何设置固定的起始值,这使得&#34;来自&#34;动画中的属性是不必要的。

<Grid Opacity="1" Height="0" VerticalAlignment="Top" Name="SettingGrid" Background="#151515">
        <CheckBox Margin="10,0,0,0" Content="Use front camera" Height="80"/>
        <TextBlock Text="IP Address" Margin="10,70,10,0" FontSize="25" FontWeight="Light" Height="30" VerticalAlignment="Top"/>
        <TextBox Text="127.0.0.1" Margin="10,100,10,0" Height="40" VerticalAlignment="Top" Name="IPBox"/>
        <TextBlock Text="Port" Margin="10,150,10,0" FontSize="25" FontWeight="Light" Height="30" VerticalAlignment="Top"/>
        <TextBox Text="12345" Margin="10,180,10,0" Height="40" VerticalAlignment="Top" Name="PortBox"/>
        <Slider Margin="10,230,10,0" Height="45" VerticalAlignment="Top" Name="updateFreq" Value="20"/>
        <StackPanel Margin="10,270,0,0" Orientation="Horizontal">
            <TextBlock FontSize="25" VerticalAlignment="Top" Margin="10,0,0,0" FontWeight="Light" HorizontalAlignment="Left" Text="{Binding ElementName=updateFreq, Path=Value}"/>
            <TextBlock Text=" Times per second" FontSize="25" FontWeight="Light" VerticalAlignment="Top"/>
        </StackPanel>
    </Grid> 

正如我所说,为什么动画不能做任何高度的事情?

2 个答案:

答案 0 :(得分:5)

而不是动画高度,而是将一个RenderTransform添加到SettingGrid,并将其动画为ScaleTransform.ScaleY从0到1.0。另一个选择是使用其中一个内置个性转换而不是自定义动画(参见Quickstart: Animating your UI using library animations (XAML)

动画高度会影响场景的布局,并需要与主UI线程同步。 这被称为“依赖动画”。动画RenderTransform将产生非常类似的效果,但不需要额外的布局传递,并且可以在渲染线程上完全运行。这被称为“独立动画”。

尽可能选择独立动画。应避免使用相关动画,默认情况下禁用它们。如果你真的想坚持使用Height属性设置动画,那么你需要将EnableDependentAnimation属性设置为true。

此方案(Height vs. RenderTransform Scale)是Make animations smooth (XAML)文档中使用的示例。

Blend对于设置动画也很棒。这是一个简单的例子。 Blend更喜欢CompositeTransform,因为它更灵活。如果您知道只需缩放,则可以使用ScaleTransform。如果您希望RenderTransformOrigin从顶部而不是中间打开,可以将其更改为0.5.0.0。

<Page.Resources>
    <Storyboard x:Name="OpenSettings">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)" Storyboard.TargetName="SettingGrid">
            <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
            <EasingDoubleKeyFrame KeyTime="0:0:1" Value="1"/>
        </DoubleAnimationUsingKeyFrames>
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="SettingGrid">
            <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
            <EasingDoubleKeyFrame KeyTime="0:0:1" Value="1"/>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
</Page.Resources>

<Grid x:Name="SettingGrid" Background="{StaticResource ApplicationPageBackgroundThemeBrush}" RenderTransformOrigin="0.5,0.5">
    <Grid.RenderTransform>
        <CompositeTransform/>
    </Grid.RenderTransform>
</Grid>

答案 1 :(得分:0)

尝试设置DoubleAnimation(s)中的值,例如:

<Storyboard x:Name="OpenSettings" Storyboard.TargetName="SettingGrid">
    <DoubleAnimation Storyboard.TargetProperty="Height" Storyboard.TargetName="SettingGrid" From="0" To="320"/>
    <DoubleAnimation Storyboard.TargetProperty="Opacity" Storyboard.TargetName="SettingGrid" To="1"/>
</Storyboard>
<Storyboard x:Name="CloseSettings">
    <DoubleAnimation Storyboard.TargetProperty="Height" Storyboard.TargetName="SettingGrid" From="320" To="0"/>
    <DoubleAnimation Storyboard.TargetProperty="Opacity" Storyboard.TargetName="SettingGrid" To="0"/>
</Storyboard>

编辑:改为使用'(FrameworkElement.Height)'

<Storyboard x:Name="OpenSettings" Storyboard.TargetName="SettingGrid">
    <DoubleAnimation Storyboard.TargetProperty="(FrameworkElement.Height)" Storyboard.TargetName="SettingGrid"  To="320"/>
    <DoubleAnimation Storyboard.TargetProperty="Opacity" Storyboard.TargetName="SettingGrid" To="1"/>
</Storyboard>
<Storyboard x:Name="CloseSettings">
    <DoubleAnimation Storyboard.TargetProperty="(FrameworkElement.Height)" Storyboard.TargetName="SettingGrid"  To="0"/>
    <DoubleAnimation Storyboard.TargetProperty="Opacity" Storyboard.TargetName="SettingGrid" To="0"/>
</Storyboard>