在移动面板中渲染控件

时间:2014-04-07 10:19:29

标签: c# winforms

我想知道为什么下面这个例子就像它一样。单击按钮时面板正在正常移动,但面板完成移动后,其中的按钮会出现。

为什么这样做?它是面板或代码的缺陷吗?

编辑:此外,该小组似乎重新着色落后的东西。有没有办法重新着色组件,所以它没有?

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;
    }
}
}

提前致谢

2 个答案:

答案 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;
}