我试图让一个多边形从屏幕左侧完整的移动到屏幕上,然后完全从屏幕右侧移开,然后再次返回.
我已经得到了这个工作.但是,由于某种原因,一旦左边距变为负值,动画就会突然减慢.一旦左边距变为正值,它将再次加速.
为什么会发生这种情况?我该如何阻止?
以下是完整的代码:
- <Window x:Class="Geometry.MainWindow"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Title="MainWindow" Height="350" Width="525">
- <Window.Resources>
- <PathGeometry x:Key="MyGeometry">
- <PathGeometry.Figures>
- <PathFigure>
- <PathFigure.Segments>
- <LineSegment Point="0.30,0" />
- <LineSegment Point="0.70,1" />
- <LineSegment Point="0.40,1" />
- <LineSegment Point="0,0" />
- </PathFigure.Segments>
- </PathFigure>
- </PathGeometry.Figures>
- </PathGeometry>
- <Storyboard x:Key="MovingAnimation">
- <ThicknessAnimationUsingKeyFrames RepeatBehavior="1:0:0" FillBehavior="HoldEnd" Storyboard.TargetName="_path" Storyboard.TargetProperty="Margin" >
- <DiscreteThicknessKeyFrame KeyTime="0:0:0" Value="-2.0,0" />
- <LinearThicknessKeyFrame KeyTime="0:0:10" Value="1.0,0" />
- <LinearThicknessKeyFrame KeyTime="0:0:20" Value="-2.0,0" />
- </ThicknessAnimationUsingKeyFrames>
- </Storyboard>
- </Window.Resources>
- <Window.Triggers>
- <EventTrigger RoutedEvent="Window.Loaded">
- <BeginStoryboard Storyboard="{StaticResource MovingAnimation}" ></BeginStoryboard>
- </EventTrigger>
- </Window.Triggers>
- <Grid>
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto" />
- <RowDefinition Height="*" />
- </Grid.RowDefinitions>
- <StackPanel Grid.Row="0" Orientation="Horizontal">
- <Label>Margin:</Label>
- <TextBlock Text="{Binding ElementName=_path,Path=Margin.Left,StringFormat={}{0:0.#}}" />
- </StackPanel>
- <Canvas Name="_canvas" Grid.Row="1">
- <Border Margin="0" Width="1" Height="1" VerticalAlignment="Center" HorizontalAlignment="Center">
- <Border.RenderTransform>
- <ScaleTransform
- ScaleX="{Binding ElementName=_canvas,Path=ActualWidth}"
- ScaleY="{Binding ElementName=_canvas,Path=ActualHeight}"
- CenterX="0"
- CenterY="0">
- </ScaleTransform>
- </Border.RenderTransform>
- <Path
- Name="_path"
- Fill="#CCCCFF"
- Data="{StaticResource MyGeometry}"
- Width="1.0"
- Height="1.0"
- >
- </Path>
- </Border>
- </Canvas>
- </Grid>
- </Window>
解决方法
动画保证金属性将触发额外的度量/安排通行证,从而导致更多的性能影响(尽管在这个例子中可能不明显).另一方面,“仅渲染”属性的动画将不会触发布局重新布置,因此更具性能友好.
请,看看有点简单的方法做什么,我想,你想得到:
- <Window x:Class="Geometry.MainWindow"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Title="MainWindow" Height="518" Width="530">
- <Window.Resources>
- <PathGeometry x:Key="MyGeometry">
- <PathGeometry.Figures>
- <PathFigure>
- <PathFigure.Segments>
- <LineSegment Point="0.30,0" />
- <LineSegment Point="0.70,1" />
- <LineSegment Point="0.40,1" />
- <LineSegment Point="0,0" />
- </PathFigure.Segments>
- </PathFigure>
- </PathGeometry.Figures>
- </PathGeometry>
- <Storyboard x:Key="MovingAnimation">
- <DoubleAnimationUsingKeyFrames RepeatBehavior="1:0:0" FillBehavior="HoldEnd" Storyboard.TargetName="_scaleTransform" Storyboard.TargetProperty="CenterX" >
- <LinearDoubleKeyFrame KeyTime="0:0:0" Value="1.2" />
- <LinearDoubleKeyFrame KeyTime="0:0:10" Value="-0.5" />
- <LinearDoubleKeyFrame KeyTime="0:0:20" Value="1.2" />
- </DoubleAnimationUsingKeyFrames>
- </Storyboard>
- </Window.Resources>
- <Window.Triggers>
- <EventTrigger RoutedEvent="Window.Loaded">
- <BeginStoryboard Storyboard="{StaticResource MovingAnimation}" ></BeginStoryboard>
- </EventTrigger>
- </Window.Triggers>
- <Grid>
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto" />
- <RowDefinition Height="*" />
- </Grid.RowDefinitions>
- <StackPanel Grid.Row="0" Orientation="Horizontal">
- <Label>Margin:</Label>
- <TextBlock Text="{Binding ElementName=_scaleTransform,Path=CenterX,StringFormat={}{0:0.#}}" VerticalAlignment="Center" />
- </StackPanel>
- <!--
- <Border Grid.Row="1" Margin="150" BorderBrush="Red" BorderThickness="1">
- -->
- <Grid Name="_canvas" Grid.Row="1">
- <Path Name="_path" Fill="#CCCCFF" Data="{StaticResource MyGeometry}"
- Width="1.0"
- Height="1.0"
- HorizontalAlignment="Center"
- VerticalAlignment="Center">
- <Path.RenderTransform>
- <ScaleTransform x:Name="_scaleTransform"
- ScaleX="{Binding ElementName=_canvas,Path=ActualHeight}"
- CenterX="1.2"
- CenterY="0.5">
- </ScaleTransform>
- </Path.RenderTransform>
- </Path>
- </Grid>
- <!--
- </Border>
- -->
- </Grid>
- </Window>