C#:当事件发生时立即执行它';提高

C#:当事件发生时立即执行它';提高,c#,wpf,events,text-to-speech,C#,Wpf,Events,Text To Speech,我目前正在用C#和WPF开发一个文本到语音的应用程序 要重新开始播放,我需要先取消播放,然后再重新开始播放。 我在SpeakCompletedEventHandler中添加了一个函数(speaker\u finished()),在播放完成或取消时调用该函数speaker_finished()调用outputVisible(false),将某些UI元素设置为不可见。但当我重新启动播放时,我希望它们保持可见。 对于该outputVisible(true)在speaker.SpeakAsyncCanc

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

要重新开始播放,我需要先取消播放,然后再重新开始播放。
我在
SpeakCompleted
EventHandler中添加了一个函数(
speaker\u finished()
),在播放完成或取消时调用该函数
speaker_finished()
调用
outputVisible(false)
,将某些UI元素设置为不可见。但当我重新启动播放时,我希望它们保持可见。
对于该
outputVisible(true)
speaker.SpeakAsyncCancelAll()之后调用。这将取消播放,然后将UI元素设置为可见。
问题是
speaker\u finished()
按钮重新启动后被调用,因此太晚了。我希望在使用
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);
}

SpeechSynthesizer
也有一个
SpeakStarted
事件。尝试为其添加事件处理程序,就像对
SpeakCompleted

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