C#:引发事件时立即执行事件
C#: Execute Event immediately when it's raised
我目前正在使用 WPF 在 C# 中开发文本到语音应用程序。
要重新开始播放,我需要先取消,然后再开始。
我在 SpeakCompleted
事件处理程序中添加了一个函数 (speaker_finished()
),在播放完成或取消时调用该函数。 speaker_finished()
调用 outputVisible(false)
将某些 UI 元素设置为不可见。但是当我重新开始播放时,我希望它们保持可见。
因为 outputVisible(true)
在 speaker.SpeakAsyncCancelAll()
之后被调用。这将取消播放,然后将 UI 元素设置为可见。
问题是 speaker_finished()
在 buttonRestart_Click()
完成后被调用,因此为时已晚。我希望它在我用 speaker.SpeakAsyncCancelAll()
取消播放后和 outputVisible(true)
被调用之前立即被调用。
我怎样才能做到这一点?
SpeechSynthesizer speaker = new SpeechSynthesizer();
private void buttonRestart_Click(object sender, RoutedEventArgs e)
{
speaker.SpeakAsyncCancelAll();
outputVisible(true); //this function needs to be called after the function in the event handler
speaker_Start();
}
//function in the EventHandler of SpeakFinished
private void speaker_Finished(object sender, SpeakCompletedEventArgs e)
{
outputVisible(false);
}
//function that changes the visibility
private void outputVisible(bool b)
{
if(b)
{
textBlockOutput.Visibility = Visibility.Visible;
foreach (UIElement UIEle in GridPlaybackButtons.Children)
{
UIEle.Visibility = Visibility.Visible;
}
}
else
{
textBlockOutput.Visibility = Visibility.Hidden;
foreach (UIElement UIEle in GridPlaybackButtons.Children)
{
UIEle.Visibility = Visibility.Hidden;
}
}
}
//function that starts the SpeechSynthesizer
private void speaker_Start()
{
if (speaker.State == SynthesizerState.Ready)
{
speaker.SpeakAsync(speakString);
}
else
{
MessageBox.Show("There already is a text being output!","Error!", MessageBoxButton.OK);
}
}
SpeechSynthesizer
也有一个 SpeakStarted
事件。像 SpeakCompleted
一样尝试为它添加一个事件处理程序
private void speaker_Started(object sender, SpeakStartedEventArgs e)
{
outputVisible(true);
}
我目前正在使用 WPF 在 C# 中开发文本到语音应用程序。
要重新开始播放,我需要先取消,然后再开始。
我在 SpeakCompleted
事件处理程序中添加了一个函数 (speaker_finished()
),在播放完成或取消时调用该函数。 speaker_finished()
调用 outputVisible(false)
将某些 UI 元素设置为不可见。但是当我重新开始播放时,我希望它们保持可见。
因为 outputVisible(true)
在 speaker.SpeakAsyncCancelAll()
之后被调用。这将取消播放,然后将 UI 元素设置为可见。
问题是 speaker_finished()
在 buttonRestart_Click()
完成后被调用,因此为时已晚。我希望它在我用 speaker.SpeakAsyncCancelAll()
取消播放后和 outputVisible(true)
被调用之前立即被调用。
我怎样才能做到这一点?
SpeechSynthesizer speaker = new SpeechSynthesizer();
private void buttonRestart_Click(object sender, RoutedEventArgs e)
{
speaker.SpeakAsyncCancelAll();
outputVisible(true); //this function needs to be called after the function in the event handler
speaker_Start();
}
//function in the EventHandler of SpeakFinished
private void speaker_Finished(object sender, SpeakCompletedEventArgs e)
{
outputVisible(false);
}
//function that changes the visibility
private void outputVisible(bool b)
{
if(b)
{
textBlockOutput.Visibility = Visibility.Visible;
foreach (UIElement UIEle in GridPlaybackButtons.Children)
{
UIEle.Visibility = Visibility.Visible;
}
}
else
{
textBlockOutput.Visibility = Visibility.Hidden;
foreach (UIElement UIEle in GridPlaybackButtons.Children)
{
UIEle.Visibility = Visibility.Hidden;
}
}
}
//function that starts the SpeechSynthesizer
private void speaker_Start()
{
if (speaker.State == SynthesizerState.Ready)
{
speaker.SpeakAsync(speakString);
}
else
{
MessageBox.Show("There already is a text being output!","Error!", MessageBoxButton.OK);
}
}
SpeechSynthesizer
也有一个 SpeakStarted
事件。像 SpeakCompleted
private void speaker_Started(object sender, SpeakStartedEventArgs e)
{
outputVisible(true);
}