我试图在屏幕上移动一条红线(无口吃),我尝试了各种不同的方法。从GDI +双缓冲(使用BufferedGraphics
类)到WPF的WriteableBitmap
,都失败了。可能是我使用的计时器不够准确,它可能会同步撕裂,但这似乎是不可能的。我们现在已经到了2013年,而且我有一个高端的GPU,但仍然无法重现我原来的8位SNES没有问题的东西。
有人拥有100%平滑且无闪烁的WinForms代码示例,或者只是在没有DirectX的情况下完成任务是不可能的?
答案 0 :(得分:0)
在WPF中,您可以简单地为Line控件设置动画。
<Canvas>
<Line x:Name="line"
X2="{Binding X1, RelativeSource={RelativeSource Mode=Self}}"
Y2="{Binding ActualHeight, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Canvas}}" Stroke="Red" StrokeThickness="4">
</Line>
</Canvas>
您可以使用以下方法创建和启动动画:
private void StartAnimation()
{
var animation = new DoubleAnimation
{
To = ActualWidth, // width of the window
Duration = TimeSpan.FromSeconds(ActualWidth / 32),
RepeatBehavior = RepeatBehavior.Forever
};
line.BeginAnimation(Line.X1Property, animation);
}
您可以为线条的RenderTransform设置动画,而不是为Line的X1
属性设置动画并让X2
属性跟随绑定:
<Canvas>
<Line Y2="{Binding ActualHeight, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Canvas}}" Stroke="Red" StrokeThickness="4">
<Line.RenderTransform>
<TranslateTransform x:Name="transform"/>
</Line.RenderTransform>
</Line>
</Canvas>
StartAnimation方法现在看起来像这样:
private void StartAnimation()
{
var animation = new DoubleAnimation
{
To = ActualWidth, // width of the window
Duration = TimeSpan.FromSeconds(ActualWidth / 32),
RepeatBehavior = RepeatBehavior.Forever
};
transform.BeginAnimation(TranslateTransform.XProperty, animation);
}