2016-01-30 68 views
0

我已經創建了一個winform應用程序,其中,點擊按鈕,將生成文本框。現在我必須爲這些文本框添加語音。例如,如果文本框的文本是'hello',則會有演講'hello'。如何在winforms中爲動態生成的文本框添加語音c#

到目前爲止,我已經嘗試過。 :

private void btnAdd_Click(object sender, EventArgs e) 
{ 
    TextBox textbox = new TextBox(); 
    int count = panel1.Controls.OfType<TextBox>().ToList().Count; 
    textbox.Location = new System.Drawing.Point(60, 25 * count); 
    textbox.Size = new System.Drawing.Size(220, 20); 
    textbox.Multiline = true; 
    textbox.Name = "textbox_" + (count + 1); 
    //textbox.TextChanged += new System.EventHandler(this.TextBox_Changed); 
    panel1.Controls.Add(textbox); 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    SpVoice vc = new SpVoice(); 
    vc.Speak(textbox1.Text, SpeechVoiceSpeakFlags.SVSFDefault); 
} 

我使用speechLib庫講話。在簡單的情況下工作正常。

但是,當動態創建文本框時,我無法訪問其ID或名稱。

+0

如果添加的文本框是在相同的形式,其中按鈕是本目前尚不清楚。如果是這種情況,那麼在表單加載事件中不可能使用不存在的文本框。你能澄清這一點嗎? – Steve

+0

是的。文本框和按鈕的形式相同@Steve –

+0

但是,在form_load事件中TextBox不存在。你不能使用它。也許你需要一個不同的按鈕來執行當前在Form_Load事件 – Steve

回答

0

如果文本框是在按鈕單擊事件中創建的,則在form_load事件中它不存在,因此您不能將其用作語音庫的輸入。

但是,當您創建文本框時,您可以爲屬性標記添加一個值。
例如

private void btnAdd_Click(object sender, EventArgs e) 
{ 
    TextBox textbox = new TextBox(); 
    ..... 
    textbox.Name = "textbox_" + (count + 1); 
    textbox.Tag = "SPEECH"; 
    .... 
    panel1.Controls.Add(textbox); 
} 

現在,當您需要檢索該動態創建文本框,並使用語音庫,你可以寫。但對於例如我使用的事件處理程序不同的按鈕

private void AnotherButton_Click(object sender, EventArgs e) 
{ 
    TextBox txt = panel1.Controls 
         .OfType<TextBox>() 
         .FirstOrDefault(x =x.Tag.ToString() == "SPEECH"); 

    if (txt != null) 
    { 
     SpVoice vc = new SpVoice(); 
     vc.Speak(txt.Text, SpeechVoiceSpeakFlags.SVSFDefault); 
    } 
    else 
    { 
     MessageBox.Show("Press the create button first!"); 
    } 
} 

如果你願意,你也可以使用相同的按鈕事件處理程序。檢查是否存在具有指定標籤的控件,如果沒有創建,則執行語音通話。

private void btnAdd_Click(object sender, EventArgs e) 
{ 
    TextBox txt = panel1.Controls 
         .OfType<TextBox>() 
         .FirstOrDefault(x =x.Tag.ToString() == "SPEECH"); 

    if (txt != null) 
    { 
     SpVoice vc = new SpVoice(); 
     vc.Speak(txt.Text, SpeechVoiceSpeakFlags.SVSFDefault); 
    } 
    else 
    { 
     TextBox textbox = new TextBox(); 
     ..... 
     textbox.Name = "textbox_" + (count + 1); 
     textbox.Tag = "SPEECH"; 
     .... 
     panel1.Controls.Add(textbox); 
    } 
} 

編輯 這是假設只有一個與語音標籤設置文本框。如果你想要多個文本框,那麼你應該能夠告訴你想要「說話」哪一個(在文本框的右側用揚聲器圖像添加一個小按鈕?)或者用SPEECH標籤遍歷所有文本框和呼叫講爲每一個

像這樣

var speechBoxes = panel1.Controls 
        .OfType<TextBox>() 
        .Where(x =x.Tag.ToString() == "SPEECH"); 

if (speechBoxes != null) 
{ 
    SpVoice vc = new SpVoice(); 

    foreach(TextBox txt in speechBoxes) 
    { 
     vc.Speak(txt.Text, SpeechVoiceSpeakFlags.SVSFDefault); 

     // Not sure if you need also to add this call .... 
     vc.WaitUntilDone(10000); 
    } 
} 
+0

這將工作,如果我再次添加新的文本框? –

+1

當然不是。這假定只有一個帶語音的文本框。如果你想要多個文本框,那麼你應該能夠告訴哪一個你想'說話'或者用SPEECH標籤遍歷所有的文本框,併爲每一個文本框調用Speak。 – Steve

相關問題