.net - WinRT 动画不显示中间值

标签 .net xaml animation windows-runtime winrt-xaml

在 WinRT 中,许多动画根本不显示任何中间值,或者仅在移动鼠标或发生其他一些系统事件时才显示它们,这很奇怪。在动画结束时,值被正确设置,但在执行期间(在我的例子中动画的 2 秒持续时间),中间值永远不会显示。

2 秒后,窗口消失,但当您按 X 时,您看不到它翻转。有时,如果您在动画过程中移动鼠标,您可以看到它,但这通常仅在 XAML 图形更复杂时才会发生。

这是 XAML:

<Grid Background="#525252">
        <Grid x:Name="AnimatedDialog"
              HorizontalAlignment="Center"
              VerticalAlignment="Center">
            <Grid.Projection>
                <PlaneProjection />
            </Grid.Projection>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>

            <Border Grid.RowSpan="2"
                    Grid.ColumnSpan="2"
                    Background="White"
                    BorderBrush="#2E2E2E"
                    BorderThickness="1" />

            <Border Background="#2E2E2E" />
            <TextBlock Grid.Row="0"
                       Grid.Column="0"
                       Margin="10,5"
                       HorizontalAlignment="Left"
                       VerticalAlignment="Center"
                       FontFamily="Segoe UI"
                       FontSize="20"
                       FontWeight="SemiBold"
                       Text="{Binding Title,
                                      ElementName=Root,
                                      FallbackValue='This is the title'}" />
            <Border Grid.Row="0"
                    Grid.Column="1"
                    Width="40"
                    Height="40"
                    HorizontalAlignment="Right"
                    VerticalAlignment="Top"
                    Background="#BD0000"
                    BorderThickness="0"
                    Padding="0"
                    PointerReleased="CloseBorder_OnPointerReleased" />
            <TextBlock Grid.Row="0"
                       Grid.Column="1"
                       HorizontalAlignment="Center"
                       VerticalAlignment="Center"
                       FontFamily="Segoe UI Symbol"
                       FontSize="22"
                       Foreground="White"
                       IsHitTestVisible="False"
                       Text="❌" />

            <TextBlock Grid.Row="1"
                       Grid.Column="0"
                       Grid.ColumnSpan="2"
                       Width="550"
                       Height="360"
                       Margin="10"
                       FontSize="22"
                       Foreground="Black"
                       IsHitTestVisible="False"
                       Text="Bacon ipsum dolor amet boudin ground round drumstick porchetta prosciutto spare ribs short ribs bresaola leberkas hamburger sirloin shank tri-tip turkey strip steak. Rump boudin shank, ham hock bresaola shankle shoulder. Alcatra landjaeger kevin tail hamburger turducken flank pork. Meatloaf turducken leberkas, pig sausage pancetta ground round. Beef kevin swine tongue ham hock bacon shoulder leberkas kielbasa rump capicola ribeye chicken shankle venison. Biltong ball tip prosciutto, t-bone cow pork ribeye pancetta strip steak jowl ham drumstick landjaeger short ribs andouille. Turducken tail shankle bacon, pork turkey filet mignon ham pig."
                       TextWrapping="WrapWholeWords" />
        </Grid>
    </Grid>

以及背后的代码:

        private void CloseBorder_OnPointerReleased(object sender, PointerRoutedEventArgs e)
        {
            // Spin AnimatedDialog to close.

            var storyboard = new Storyboard();

            var projection = AnimatedDialog.Projection as PlaneProjection;
            projection.CenterOfRotationY = 0.5;

            var flipAnim = new DoubleAnimation();

            Storyboard.SetTarget(flipAnim, projection);
            Storyboard.SetTargetProperty(flipAnim, "RotationX");

            // 2 second flip
            flipAnim.Duration = new Duration(new TimeSpan(0, 0, 2));
            flipAnim.EasingFunction = new QuadraticEase {EasingMode = EasingMode.EaseIn};
            flipAnim.From = 0;
            flipAnim.To = 90;

            storyboard.Children.Add(flipAnim);

            storyboard.Completed += StoryboardOnCompleted;

            storyboard.Begin();
        }

        private void StoryboardOnCompleted(object sender, object o)
        {
            Debug.WriteLine("Completed storyboard.");
        }

最佳答案

出于某种原因,当您使用接近零但实际上并非零的值时,它会起作用。

        private void CloseBorder_OnPointerReleased(object sender, PointerRoutedEventArgs e)
        {
            // Spin AnimatedDialog to close.

            var storyboard = new Storyboard();

            var projection = AnimatedDialog.Projection as PlaneProjection;
            projection.CenterOfRotationY = 0.5;
            projection.RotationX = .0000000001;  // <--- this line changed

            var flipAnim = new DoubleAnimation();

            Storyboard.SetTarget(flipAnim, projection);
            Storyboard.SetTargetProperty(flipAnim, "RotationX");

            // 2 second flip
            flipAnim.Duration = new Duration(new TimeSpan(0, 0, 2));
            flipAnim.EasingFunction = new QuadraticEase { EasingMode = EasingMode.EaseIn };
            flipAnim.From = projection.RotationX;  // <--- this line changed
            flipAnim.To = 90;

            storyboard.Children.Add(flipAnim);

            storyboard.Completed += StoryboardOnCompleted;

            storyboard.Begin();
        }

        private void StoryboardOnCompleted(object sender, object o)
        {
            Debug.WriteLine("Completed storyboard.");
        }

关于.net - WinRT 动画不显示中间值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26986296/

相关文章:

c# - 取消 Socket.xxxxAsync 调用

.net - 如何阻止 NpgsqlDataReader 阻塞?

c# - 无法通过 C# 连接到 ManagementScope。拒绝访问

c# - 如何从单独的程序集中加载 WPF 应用程序资源 "via Code"(不是 "via XAML")

ios - 如何使 UIView 动画重新执行,而不是在 IOS 中重复执行(Swift)

Android 场景和过渡、动画之间的区别以及何时使用它们

.net - 为什么 .NET 异常是可变的?

c# - 绑定(bind)数据网格后,项目集合必须为空

java - 在 Java 中对像素网格进行动画处理

xaml - 绑定(bind) XAML 中的 XPath 语法