C#Win。形式:同时显示多个转换

问题描述 投票:0回答:1

技术栈

  • Windows窗体
  • C#
  • Visual Studio 2008(但如果解决方案需要,可以升级)

愿望

我想为我的Windows窗体应用程序中的几个控件提供动画/转换,这要求用户同时移动几个控件不阻塞UI

问题

根据我在多个博客/帖子上所读的内容,Windows窗体具有单个UI线程,在该情况下,我可以完成所有与UI相关的任务(Link),但是不能显示平滑过渡,例如:-

  • 滑动面板
  • 增长/收缩效果等

到目前为止我尝试过的事情

  1. Background Worker / Timer / Thread:由于它用于在后台执行计算,因此无法使用,但是我想要的是仅在UI而非背景上有效的过渡。
  2. MTA / STA:我认为它可能不起作用,因为它不使用单个UI线程概念,但是由于互联网上缺少示例,因此我不知道如何在其上进行项目。
  3. 在主UI线程上工作:它与DoubleBuffer一起正常工作,但是当一个过渡开始时,它将阻塞整个UI,直到完成工作为止。

如果您有任何建议/解决方法,或者想指出我所提到的任何错误,请随时进行。

c# multithreading visual-studio winforms
1个回答
0
投票
似乎您正在使用相当老的IDE和技术来开发桌面应用程序。假设您有一个按钮和一个面板,并且您希望在单击按钮时将面板向下移动,同时仍然能够与UI进行交互。您可以使用BackgroundWorker类执行此操作,并以一定的时间间隔报告工作人员的进度:

private void button1_Click(object sender, EventArgs e) { var backgroundWorker = new BackgroundWorker(); backgroundWorker.WorkerReportsProgress = true; backgroundWorker.DoWork += (s, a) => { for (var i = 0; i < 100; i = i++) { Thread.Sleep(15); backgroundWorker.ReportProgress(i); } }; backgroundWorker.ProgressChanged += (s, a) => { var percentage = a.ProgressPercentage; panel1.Top = percentage; }; backgroundWorker.RunWorkerCompleted += (s, a) => { // do something when animation is complete }; backgroundWorker.RunWorkerAsync(); }

[它还支持取消,以防您需要中断它。
© www.soinside.com 2019 - 2024. All rights reserved.