【问题标题】:form transition is slow表单转换很慢
【发布时间】:2015-06-30 15:18:33
【问题描述】:

单击按钮时我的表单转换很慢,我正在使用线程来产生表单不透明度从0.1开始并增加数字的表单效果。然后我有一个方法,并从线程中的 Form_Load 启动该方法。

private void RunTimer_Tick_Things()
    {
        if (flag)
        {
            while (this.Opacity <= cs.CheckMaxOpacityValue())
            {
                Thread.Sleep(cs.GetTimerSleepNumberToIncreaseOcacity());
                if (this.Opacity == cs.CheckMaxOpacityValue())
                {
                    thrdTimer.Abort();
                    break;
                }
                this.Opacity += cs.GetIncreasedOpacityValue();

            }

        }
        else
        {
            while (this.Opacity >= cs.CheckMinOpacityValue())
            {
                Thread.Sleep(cs.GetTimerSleepNumberToDecreaseOpacity());
                this.Opacity -= cs.GetDecreasedOpacityValue();
            }

            thrdTimer.Abort();

        }
    }

我在这个表单中有按钮可以打开另一个表单。像这样

private void button2_Click(object sender, EventArgs e)
    {
        Form2DatabaseSetup frm2 = new Form2DatabaseSetup();
        StopThread();
        this.Hide();
        frm2.Show();
        flag = false;

    }

我的问题是当我单击此按钮时,第二个表单打开缓慢。 考虑一下,您单击按钮,然后第一个表单隐藏并等待 1.5 秒,然后第二个表单打开。 注意:第二种形式具有线程和相同的功能。

有没有人经历过或知道、了解过这个案例?

【问题讨论】:

  • 您可能也对这个问题的答案感兴趣:stackoverflow.com/questions/12497826/…
  • 您使用的是 WinForms 还是 WPF?
  • 开始使用 WPF ... 这样的事情要容易得多。它可能打开缓慢,因为 UI 线程正在为不透明度设置动画并显示新表单。
  • 你传递给线程睡眠函数的时间是多少?
  • @AlexBell , 没有标准的窗口形式

标签: c# multithreading forms


【解决方案1】:

起初我以为您将不透明度增加了 0.01,所以 15 * 100 =1.5 正是您所描述的,但是在您发送值之后,我可以看到增加的是 0.06,所以我认为您的所有功能都有一些问题有(GetTimerSleepNumberToIncreaseOcacity, GetIncreasedOpacityValue)。

尝试代替函数来处理硬编码值并逐步提高,

我使用此代码,它工作正常:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var f = new Form2();
        f.Show();
        new Thread(() =>
        {
            while (f.Opacity < 1)
            {
                Thread.Sleep(15);
                //if (this.Opacity == cs.CheckMaxOpacityValue())
                //{
                //    thrdTimer.Abort();
                //    break;
                //}
                f.Invoke((Action)delegate { f.Opacity += 0.06; });

            }

        }).Start();
    }
}

【讨论】:

  • 谢谢@Liran,我现在试了一下,发现了我没有写的另一个问题。谢谢,表格等待仍在进行中。我不能投票给你的评论,因为我没有 15 名声望。
  • 只要找到问题就可以了
猜你喜欢
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
相关资源
最近更新 更多