如何以渐进方式平滑地更改PictureBox大小?(在winforms中,c#,visual studio 2013)

如何以渐进方式平滑地更改PictureBox大小?(在winforms中,c#,visual studio 2013),c#,winforms,picturebox,C#,Winforms,Picturebox,我的表格中有一个按钮和一个宽度为290、高度为145的图片盒,一开始是隐藏的。我想在按钮的鼠标事件发生时一点一点地显示PictureBox。所以我尝试了以下代码: private void button1_MouseEnter(object sender, EventArgs e) { pictureBox1.Size = new Size(0, 145); pictureBox1.Show(); for (int i = 0; i < 290; i++)

我的表格中有一个按钮和一个宽度为290、高度为145的图片盒,一开始是隐藏的。我想在按钮的鼠标事件发生时一点一点地显示PictureBox。所以我尝试了以下代码:

private void button1_MouseEnter(object sender, EventArgs e)
{
    pictureBox1.Size = new Size(0, 145);
    pictureBox1.Show();
    for (int i = 0; i < 290; i++)
        pictureBox1.Size = new Size(i, 145);
}
private void button1\u MouseEnter(对象发送方,事件参数e)
{
pictureBox1.Size=新的大小(0,145);
pictureBox1.Show();
对于(int i=0;i<290;i++)
图1.尺寸=新尺寸(i,145);
}
但它会立即以主尺寸显示PictureBox


我在这个站点()中发现了一个类似的问题,但实际上它的答案也帮不了我。

您的代码一次执行,所以您将看到的只是一个突然的变化

使用计时器,并在计时器滴答作响时逐渐增大大小

timer = new Timer(16); //~60 FPS
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);

...

private void button1_MouseEnter(object sender, EventArgs e)
{
    pictureBox1.Size = new Size(0, 145);
    pictureBox1.Show();

    timer.Enabled = true; // Enable it
}

...

private void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    if (pictureBox1.Width < 290)
        pictureBox1.Width++; //Increment
    else
        timer.Enabled = false; //Disable
}
timer=新定时器(16)//~每秒60帧
timer.appeased+=新的ElapsedEventHandler(timer\u appeased);
...
私有无效按钮1\u鼠标指针(对象发送方,事件参数e)
{
pictureBox1.Size=新的大小(0,145);
pictureBox1.Show();
timer.Enabled=true;//启用它
}
...
私有无效计时器\u已过(对象发送器,ElapsedEventArgs e)
{
如果(图片B宽度<290)
pictureBox1.Width++;//增量
其他的
timer.Enabled=false;//禁用
}
1)将新int定义为public:

public partial class Form1 : Form
    {
        int counter = 0;
.
.
.
2) 使用计时器:

 private void timer1_Tick(object sender, EventArgs e)
        {
            counter = counter + 10;
            timer1.Interval = 10;
            pictureBox1.Show();
            if (counter <= 290)
            { pictureBox1.Width += 1; }            
        }

必须使用
pictureBox
Update
方法重新绘制。此外,在速度更快的计算机上,稍有延迟将更平稳地更改大小

我更改了您的代码,如下所示:

private void button1_MouseEnter(object sender, EventArgs e)
{
    pictureBox1.Size = new Size(145, 145);            
    for (int i = 145; i < 290; i++)
    {
        pictureBox1.Size = new Size(i, i);
        pictureBox1.Update();
        System.Threading.Thread.Sleep(1);
    }
}
private void button1\u MouseEnter(对象发送方,事件参数e)
{
pictureBox1.尺寸=新尺寸(145145);
对于(int i=145;i<290;i++)
{
pictureBox1.尺寸=新尺寸(i,i);
pictureBox1.Update();
系统线程线程睡眠(1);
}
}

计时器!,因此,您可以在内部循环
delay
。代码运行速度太快,以至于您看不到中间步骤。您的代码有一些问题。由于过载错误,第一行出现错误。同样经过,ElapsedEventHandler和ElapsedEventTargets也有错误,因为找不到它们。我只是在表单中拖拽了一个计时器,并通过属性框更改了间隔。接下来,我像你一样在button1_MouseEnter中启用了计时器,我在timer_Tick中写下了你的最后四行,而不是timer_Passed。实际上,在计时器的属性框中并没有任何事件,除了勾号,我认为这些错误都是由它引起的。但是,现在PictureBox显示为我想要的样子,谢谢。请确保使用System.Timers,并且不要麻烦使用Form Creator工具拖动计时器,只需像我一样对其进行编码。我使用System.Timers添加了它,但它不再工作。如果我在窗体中拖动计时器会有什么问题?没问题,我发现只需将其编码就更容易了,通常不要将计时器视为控件。-1表示不禁用计时器。我编辑了你的答案,但你并不在意。因为它经过测试,计时器不需要停止。虽然计时器1_Tick事件中的if条件会满足提问者的要求,但该事件将永远调用,并始终调用pictureBox1.Show()和2个赋值。这导致项目朝着非优化、非标准的方向发展。这就是为什么在事件中出现第一个错误条件后最好关闭计时器。@MatinLotValiee您不能向程序员指定计时器关闭时间,请让他们自己选择,您必须给出基本答案。例如,我特意添加了timer_interval来指定图片的增长速度(因为这是必要的)。最好的基本答案是“使用计时器”,这在评论中提到过。我不认为你的回答是基本的,你已经详细说明了。稍微编辑一下你的答案,以删除否决票。
private void button1_MouseEnter(object sender, EventArgs e)
{
    pictureBox1.Size = new Size(145, 145);            
    for (int i = 145; i < 290; i++)
    {
        pictureBox1.Size = new Size(i, i);
        pictureBox1.Update();
        System.Threading.Thread.Sleep(1);
    }
}