我试图让一个多边形从屏幕左侧完整的移动到屏幕上,然后完全从屏幕右侧移开,然后再次返回.
我已经得到了这个工作.但是,由于某种原因,一旦左边距变为负值,动画就会突然减慢.一旦左边距变为正值,它将再次加速.
为什么会发生这种情况?我该如何阻止?
以下是完整的代码:
<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>