我是WPF的新手,我终于设法通过更新UI创建了一个for循环。但是我搜索了很多站点,但没有找到解决问题的方法:
在我的MainWindow中,我有一个标签
<Label x:Name="labelName" Content="{Binding LabelNameContent}"/>
以及该属性(property)背后的代码
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);
}
});
我的问题是,声音被打断并不断绊脚。
如何更新用户界面并播放声音?
最佳答案
您正在使用什么类(class)播放声音?根据类的不同,可能会发生一个事件,您可以注册一个处理程序,以便在声音播放完毕时得到通知。因此,您可以调用sound.Play
,等待AutoResetEvent
,然后在收到声音结束通知时将Set
编码为AutoResetEvent
。最后,您的循环可以继续。像这样:
在您的表格的类(class)级别:
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);
}
});
当然,如果您正在使用的声音播放器没有提供“我完成了”的事件通知,那么这将无济于事。
编辑
根据您对评论的回应,您需要让
SoundPlayer
在与UI分离的线程中以及从更新标签内容的线程中分离出来。我的WPF应用使用
SoundPlayer
播放几种不同的声音之一。每个声音都有其专用的SoundPlayer
实例。当我播放声音时,会启动一个新的Thread
,并在该Play
上调用Thread
方法。这具有以下优点:SoundPlayer
的线程即可。 关于c# - WPF-在循环更新UI时播放声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24246089/