1

グリッド行の高さの変化をアニメートしたいのですが、動的な「星」の高さの値でそれを行うにはどうすればよいですか?

次のグリッドがあります。

<Grid x:Name="baseGrid">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="3*"/>
    </Grid.RowDefinitions>
    <Grid x:Name="grid0" Grid.Row="0" Tap="grid0_Tap">
        // Content
    </Grid>
    <Grid x:Name="grid1" Grid.Row="1" Tap="grid1_Tap">
        // Content
    </Grid>
    <Grid x:Name="grid2" Grid.Row="2">
        // Content
    </Grid>
</Grid>

コード ビハインドには、ユーザーが grid0 をクリックすると grid2 が非表示になるというロジックがあります。ここでも、ユーザーが grid1 をクリックすると、grid2 のサイズが元に戻ります。

private void grid0_Tap(object sender, RoutedEventArgs e)
{
    this.LayoutRoot.RowDefinitions[2].Height = new GridLength(0);
}

private void grid1_Tap(object sender, RoutedEventArgs e)
{
    this.LayoutRoot.RowDefinitions[2].Height = new GridLength(3, GridUnitType.Star);
}

これは今のところうまくいきますが、これをアニメーション化するにはどうすればよいですか? ストーリーボードには from/to 値が必要だと思いますが、動的サイズを使用しているため、ストーリーボードを使用できませんか?

4

2 に答える 2

1

(Windows Phone 8 アニメーション ストーリーボードの質問に対処するために編集)

のアニメーション クラスはGridLength、どの XAML ライブラリにも存在しません。

しかし、あなたは近づくことができるか、あなたが望むことをするサードパーティのコントロールに目を向けることができます.

また、このユース ケースでは、実行時に要素の ActualHeight を検出しているため、XAML リソースを定義する代わりにコード ビハインドがかなり必要になります。

private double storedHeight = 0.0;
    private void grid0_Tap(object sender, System.Windows.Input.GestureEventArgs e)
    {
        //ListBox1.Visibility = Visibility.Visible; 
        if (storedHeight == 0.0) return;
        var d = new DoubleAnimation();
        d.From = 0.0;
        d.To = storedHeight;
        d.Duration = TimeSpan.FromMilliseconds(200);
        storedHeight = 0.0;
        var s = new Storyboard();
        Storyboard.SetTarget(d, grid2);
        Storyboard.SetTargetProperty(d, new PropertyPath("Height"));
        s.Children.Add(d);
        s.Begin();

    }

    private void grid1_Tap(object sender, System.Windows.Input.GestureEventArgs e)
    {
        //ListBox1.Visibility = Visibility.Hidden;
        if (storedHeight > 0.0) return;
        storedHeight = ListBox1.ActualHeight;
        var d = new DoubleAnimation();
        d.From = storedHeight;
        d.To = 0.0;
        d.Duration = TimeSpan.FromMilliseconds(200);

        var s = new Storyboard();
        Storyboard.SetTarget(d, grid2);
        Storyboard.SetTargetProperty(d, new PropertyPath("Height"));
        s.Children.Add(d);
        s.Begin();
    }
于 2013-07-29T03:41:18.280 に答える