2014-09-10 4 views
1

У меня есть кнопка в моей форме, которая помечена как «Говорить», когда пользователь нажимает на нее synth.SpeakAsync(Textbox.text) уволен, а кнопка меняет свой текст на «Остановить разговор».SpeechSynthesizer.SpeakAsyncCancelAll() не отменяет

Однако, когда пользователь нажимает кнопку остановки, тем самым загоняя synth.speakAsyncCancelAll(), он не отменяет текст речи в середине.

Вот мой код:

Private Sub btnSpeak_Click(sender As System.Object, e As System.EventArgs) Handles btnSpeak.Click 
    If RTextBox.Text = "" Then Exit Sub 

    Dim synth As New SpeechSynthesizer 
    synth.Rate = -2 

    If btnSpeak.Text = "Stop Speaking" Then 
     btnSpeak.Text = "Speak" 
     synth.SpeakAsyncCancelAll() 

    ElseIf btnSpeak.Text = "Speak" Then 
     btnSpeak.Text = "Stop Speaking" 
     synth.SpeakAsync(RTextBox.Text) 
    End If 
+0

Вы проверили, что событие SpeakCompleted уволено после отмены? http://msdn.microsoft.com/en-us/library/system.speech.synthesis.speechsynthesizer.speakasynccancelall(v=vs.110).aspx – Aybe

+0

не уверен, как это сделать – Dman

+0

См. мой ответ. – Aybe

ответ

1

Каждый раз при нажатии кнопки А создается новый синтезатор речи. Возьмите тусклый синтезатор, как новый синтезатор речи, из события нажатия кнопки. таким образом, он будет ссылаться на один и тот же синтезатор каждый раз, и тогда он должен активировать событие с отменой речи

0

SpeakAsyncCancelAll() поднимет SpeakCompleted события после вызова, вы можете слушать его, используя следующий код:

Imports System.Speech.Synthesis 

Public Class Form1 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Dim synthesizer As New SpeechSynthesizer() 
     AddHandler synthesizer.SpeakCompleted, AddressOf speakCompleted 
    End Sub 

    Private Sub speakCompleted(ByVal sender As Object, ByVal e As SpeakCompletedEventArgs) 
     Dim cancelled = e.Cancelled 
    End Sub 
End Class 
+0

не запускает завершенное речевое событие, пока оно не закончит все в текстовом поле – Dman

+0

Ну, я думаю, это самый низкий общий знаменатель, который вы получите с помощью этой функции. Возможно, вы можете попробовать Dispose() вместо этого, вам придется каждый раз создавать синтезатор. – Aybe

+1

Понял, что каждый раз, когда я нажимал на кнопку, он создавал новый синтезатор речи, поэтому я выбрал эту переменную из функции, таким образом, она создаст синтезатор в начале кода и всегда будет ссылаться на правильный. Спасибо за вашу помощь – Dman

Смежные вопросы