我是Visual C#的新手。
我正在创建一个程序,其中有一个图片框列表。我有一个for循环,根据图片框中的图像播放.wav文件。我正在使用PlaySync方法,因此对于循环中的每个i,播放.wav文件(对应于不同的图片框)直到结束,然后i增加然后播放不同的音符。
对于每个音符(基本上每个循环的i),我想改变正在播放.wav文件的图片框的背景颜色。
除非我在循环中添加消息框,否则代码运行时不会对图片框着色。我很确定我需要在循环中使用一个中断程序,以便让程序有机会为彩色图像着色。我已经尝试使用延迟(Thread.Sleep())来打破程序,但它不起作用。
我需要中断循环吗?如果是的话,会有什么用?
这是我的代码:
* arrindex是一个整数,表示要播放的音符数
* pboxlist =图片框列表
* tempind =图片框列表的索引
for (int i = 0; i <= arrindex; i++)
{
if (tempind < pboxlist.Count()) //coloring the pictureboxes
{
if (tempind != -1)
{
pboxlist[tempind].BackColor = Color.Transparent; //coloring the previous picturebox back to transparent
}
tempind++;
pboxlist[tempind].BackColor = Color.LightPink;
}
regwav[row, col].PlaySync(); // a matrix where the .wav files are stored (row and col are integers that determine which .wav file to play)
}
答案 0 :(得分:0)
您可以使用Refresh()
方法强制PictureBox
es立即刷新。但是,它不会使您的应用程序响应,只要循环运行,您的表单就不会响应任何用户交互。
另一个选项是Application.DoEvents()
,它使应用程序响应每个wave文件之间的用户交互,但它会导致比从中获得更多的麻烦(如果你可能最终在第一个循环中运行相同的循环“不小心)。
最后一个,但在大多数情况下花费时间,最好的方法是使用循环运行的单独线程。但问题是控件的属性(如PictureBox.BackColor
)只能在创建表单的线程中设置。
正如Hans Passant在评论中提到的,你可以通过完全删除循环并使用计时器来解决你的问题,记住你自己的“当前i
值”。一个表格领域。
有关使用单独线程并调用表单主题的示例,请参阅this link。
答案 1 :(得分:0)
可能发生的是你在主线程上运行PlaySync
,不允许它更新UI(即更改背景颜色)。
尝试将其作为异步播放