这是我正在使用的功能:
private void Convert2Morse(object obj)
{
TextConverted = am.Convert(NormalText);
foreach (char symbol in TextConverted)
{
int milliseconds = 0;
switch (symbol)
{
case '·': milliseconds = 500; break;
case '—': milliseconds = 1000; break;
case ' ': continue;
default: throw new Exception("Something is wrong");
}
System.Media.SystemSounds.Beep.Play();
System.Threading.Thread.Sleep(milliseconds);
}
}
TextConverted属性显示在textBox中,但在完成子例程之前会刷新。
有没有办法可以显示刷新UI?
答案 0 :(得分:5)
永远不要在UI线程中睡觉。决不。如初。
您需要创建一个新线程来播放您的声音。
答案 1 :(得分:1)
在WPF应用程序中,您可以拥有多个执行“线程” - 在同一进程中处于活动状态的独立控制流。
您在代码中采用的方法包含用户界面线程上发生的所有事情 - 这是负责重新绘制屏幕的线程。当这个线程忙于运行你的摩尔斯电码程序时,它不能进行任何重新绘制。
您需要做的是将摩尔斯电码程序的执行移动到一个单独的线程上 - 这将允许UI线程及时处理重新绘制。实现此目的的最简单方法是使用BackgroundWorker对象。 (你可以在网上找到大多数使用WinForms的例子,但它也适用于WPF。)
但请注意,您正在进入一个中等复杂的开发领域。根据你对@EboMike的评论,你会发现这是一个挑战 - 有很多很多的新概念可以帮助你理解。一个好的起点可能是CodeProject上的Beginners guide to threading。 (我发现这是谷歌搜索,前几段读取确定 - YMMV。)
祝你好运。