动画:C#表单上的滑动和淡入控件(winforms)

我正在尝试优雅地实现一种方法来动画(平移,淡化)控件(可能同时超过一个)。 例如,假设我左上角有一张图片,右下角有一个文本框,我希望能够让它们平滑地滑过窗口并切换位置。 我已经工作了一段时间,但没有提出任何能够顺利或轻松实现这一目标的事情。

查看Google Code上的dot-net-transitions项目。 现在Github上有一个克隆。 它也可以作为dot-net-transitions在nuget上使用。 它支持各种线性/非线性转换,包括复合转换,可用于更复杂的效果,如纹波。

这是一个演示您所需行为的工作示例:

 var pictureBox = new PictureBox { ImageLocation = "http://sofzh.miximages.com/c%23/hamburger-icon.png", SizeMode = PictureBoxSizeMode.AutoSize }; var textBox = new TextBox { Text = "Hello World", Location = new Point(140, 140) }; var form = new Form { Controls = { textBox, pictureBox } }; form.Click += (sender, e) => { // swap the Left and Top properties using a transition var t = new Transition(new TransitionType_EaseInEaseOut(1000)); t.add(pictureBox, "Left", textBox.Left); t.add(pictureBox, "Top", textBox.Top); t.add(textBox, "Left", pictureBox.Left); t.add(textBox, "Top", pictureBox.Top); t.run(); }; form.ShowDialog(); 

我建议你切换到WPF; 这将使它变得容易。

在WinForms中完全不可能淡化控件; Windows控件不能具有不透明度。
最接近的是将窗体上的控件及其区域渲染为一对位图,然后使用ColorMatrix对PictureBox中的位图进行交叉淡化。

要在WinForms中滑动控件,可以使用Timer逐步更改控件的Top和/或Left属性,并在窗体中移动它们。 但是,你会得到一个恼人的闪烁,这是(AFAIK)无法删除。

可以在WinForms中完成这项工作,需要付出很多努力,所以我必须推荐使用WPF(它主要是针对这种事情而构建的)。

在WinForms中执行此操作的主要障碍是控件位置由整数指定,这意味着您无法将控件的Left属性设置为45.3425 。 这基本上使得控制的平滑动画(假设你想要改变速度和方向的运动)完全不可能 – 你将以这种方式获得不可避免的运动急动(我已经尝试过,所以我知道)。

正如SLaks建议的那样,在WinForms中执行此操作的唯一方法是通过对每个控件进行“快照”来“伪造”它。 基本上,您将从表单大小的不可见位图开始,使用表单的BackColor绘制。 然后,您可以通过在要设置动画的每个控件上调用DrawToBitmap()来创建“快照”,并通过将快照绘制到canvas上来创建移动效果( System.Drawing可以绘制具有浮点坐标的图像,避免了整数位置)。

不过,这太糟糕了。 只需使用WPF。 🙂

编辑:我应该提一下,在WinForms中做这样的事情实际上很容易 ,只要你不介意它看起来很可怕,生涩和业余。 我的上述评论指的是做得好的困难。

将每个项的x和y值的副本保存为浮点数。

使用计时器,每次勾选时,在左上角项目的x和y位置添加一个值。 从右下角的项目的x和y中减去相同的值。

确保在此处使用缓存的浮点值,否则在表单上重新定位项时可能会出现舍入错误。

如果您在用于图像/控件的任何表面上进行绘画,请为每个刻度线使其无效。

应该是轻松的。

编辑:

对于透明控件,请查看Bob Powell的提示和技巧:

http://www.bobpowell.net/transcontrols.htm

以下是他自己对如何制作半透明控件的回复:

http://www.mofeel.net/67-microsoft-public-dotnet-framework-windowsforms-controls/4860.aspx

我相信使用内置AnimateWindow的这个答案为此目的要好得多: 如何在C#中为我的控件添加移动效果?