我想知道为什么下面这个例子就像它一样。单击按钮时面板正在正常移动,但面板完成移动后,其中的按钮会出现。
为什么这样做?它是面板或代码的缺陷吗?
编辑:此外,该小组似乎重新着色落后的东西。有没有办法重新着色组件,所以它没有?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace testMeny
{
public partial class Form1 : Form
{
Panel menu;
int menuSpeed = 1;
Boolean menuHidden = true;
public Form1()
{
InitializeComponent();
this.FormBorderStyle = FormBorderStyle.None;
menu = new Panel();
menu.Size = new Size(100, 500);
menu.Location = new Point(-100, 0);
menu.BackColor = Color.Bisque;
Controls.Add(menu);
Point loc = new Point(10, 10);
for (int i = 0; i < 3; i++)
{
Button b = new Button();
b.Text = String.Format("Knapp {0}", i + 1);
b.Location = loc;
loc.Offset(0, 50);
b.Size = new Size(80, 40);
menu.Controls.Add(b);
}
}
private void Form1_Load(object sender, EventArgs e)
{
textBox1.Text = menuSpeed.ToString();
}
private void button1_Click(object sender, EventArgs e)
{
if(menuHidden) {
menu.BringToFront();
for (int i = 0; i < menu.Size.Width; i++)
{
menu.Location = new Point(menu.Location.X+1, 0);
System.Threading.Thread.Sleep(Convert.ToInt32(textBox1.Text));
}
}
else
{
for (int i = 0; i < menu.Size.Width; i++)
{
menu.Location = new Point(menu.Location.X - 1, 0);
System.Threading.Thread.Sleep(Convert.ToInt32(textBox1.Text));
}
}
menuHidden = !menuHidden;
}
}
}
提前致谢
答案 0 :(得分:0)
作为第一遍,我可能会将动画效果放在Form_Load
方法中,以确保在开始操作之前完全显示表单。如果屏幕没有很好地更新,请尝试在每次更新之间对表单调用Invalidate
(将导致表单重绘)。如果你想获得高级,计算旧位置和新位置的边界矩形,只会使其失效(为了更好的速度)。
您可能会发现动画运行时还有其他更新问题,因为您没有给消息队列处理时间。处理此问题的最佳方法是设置计时器,每次滴答时只更新一次动画,一旦完成动画就取消计时器。您可以尝试使用计时器间隔以使其达到正确的速度。
答案 1 :(得分:0)
调用Refresh()重新绘制表单。
private void button1_Click(object sender, EventArgs e)
{
if (menuHidden)
{
menu.BringToFront();
for (int i = 0; i < menu.Size.Width; i++)
{
menu.Location = new Point(menu.Location.X + 1, 0);
System.Threading.Thread.Sleep(Convert.ToInt32(textBox1.Text));
Refresh(); // <-----------------------
}
}
else
{
for (int i = 0; i < menu.Size.Width; i++)
{
menu.Location = new Point(menu.Location.X - 1, 0);
System.Threading.Thread.Sleep(Convert.ToInt32(textBox1.Text));
Refresh(); // <-----------------------
}
}
menuHidden = !menuHidden;
}