c#:当事件被触发时立即执行事件

本文关键字:事件 执行 | 更新日期: 2023-09-27 18:08:41

我目前正在用WPF用c#开发一个文本到语音的应用程序。

要重新开始播放,我需要先取消它,然后再开始播放。
我添加了一个函数(speaker_finished())到SpeakCompleted EventHandler,当播放完成或取消时调用。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);
        }
    }

c#:当事件被触发时立即执行事件

SpeechSynthesizer也有一个SpeakStarted事件。尝试为它添加一个事件处理程序,就像对SpeakCompleted所做的那样。

private void speaker_Started(object sender, SpeakStartedEventArgs e)
{
    outputVisible(true);
}