我是WPF的新手,我终于设法创建了一个更新UI的for循环。但我搜索了很多网站,并没有找到解决问题的方法:
在我的MainWindow中,我有一个标签
<Label x:Name="labelName" Content="{Binding LabelNameContent}"/>
并在属性的代码隐藏
public string LabelNameContent
{
get { return labelNameContent; }
set
{
labelNameContent = value;
RaisePropertyChanged("LabelNameContent");
}
}
标签的文本在循环中更新,并且在循环期间应播放声音
Task.Factory.StartNew(() =>
{
sound.Play();
for(int i=0; i< 150; i++)
{
LabelNameContent = i.ToString();
Thread.Sleep(500);
}
});
我的问题是,声音被打断并且一直磕磕绊绊。
如何更新用户界面并播放声音?
答案 0 :(得分:1)
你用什么课来播放声音?根据课程的不同,可能会有一个事件,您可以注册处理程序,以便在声音播放完毕时收到通知。因此,当您收到声音完成的通知时,您可以拨打sound.Play
,等待AutoResetEvent
,然后Set
AutoResetEvent
。最后,你的循环可以继续。像这样:
在表单的课程级别:
AutoResetEvent soundFinishedFlag = new AutoResetEvent(false);
然后,在你创建声音播放器的地方,你会这样做:
sound.Finished += SoundFinished;
请注意,上述行完全取决于您正在使用的声音播放器!这只是一个例子!
最后,您的匿名函数变为:
Task.Factory.StartNew(() =>
{
sound.Play();
// Wait for the sound to finish playing!
AutoResetEvent.WaitOne(); // Note that this can take an optional time out so you can limit how long your program waits, if you want to.
for(int i = 0; i < 150; i++)
{
LabelNameContent = i.ToString();
Thread.Sleep(500);
}
});
当然,如果你正在使用的声音播放器没有提供一个事件通知,上面写着&#34;我已经完成了#34;,这不会有帮助。
修改强>
根据您在评论中的回复,您需要让SoundPlayer
在与UI和&amp;从更新标签内容的那个。
我的WPF应用使用SoundPlayer
播放几种不同的声音之一。每个声音都有自己的专用SoundPlayer
实例。当我播放声音时,会启动一个新的Thread
&amp;在Play
上调用Thread
方法。这具有以下优点:
SoundPlayer
。