C# 如何在WinC窗体中为动态生成的文本框添加语音#

C# 如何在WinC窗体中为动态生成的文本框添加语音#,c#,.net,winforms,C#,.net,Winforms,我已经创建了一个winform应用程序,在该应用程序中,单击按钮,将生成文本框。现在我必须为这些文本框添加语音。例如,如果textbox的文本为“hello”,则会有语音说“hello” 到目前为止我已经试过了 private void btnAdd_Click(object sender, EventArgs e) { TextBox textbox = new TextBox(); int count = panel1.Controls.OfType<TextBox&g

我已经创建了一个winform应用程序,在该应用程序中,单击按钮,将生成文本框。现在我必须为这些文本框添加语音。例如,如果textbox的文本为“hello”,则会有语音说“hello”

到目前为止我已经试过了

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);
}
private void btnAdd\u单击(对象发送者,事件参数e)
{
TextBox TextBox=新建TextBox();
int count=panel1.Controls.OfType().ToList().count;
textbox.Location=new System.Drawing.Point(60,25*计数);
textbox.Size=新系统.Drawing.Size(220,20);
textbox.Multiline=true;
textbox.Name=“textbox”+(计数+1);
//textbox.TextChanged+=new System.EventHandler(this.textbox\u已更改);
panel1.控件.添加(文本框);
}
私有void Form1\u加载(对象发送方、事件参数e)
{
SpVoice vc=新的SpVoice();
Speak(textbox1.Text,SpeechVoiceSpeakFlags.SVSFDefault);
}
我正在使用speechLib库进行演讲。在简单的情况下可以罚款


但是当动态创建textbox时,我无法访问它的ID或名称

如果文本框是在button click事件中创建的,则在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另一个按钮\u单击(对象发送者,事件参数e)
{
TextBox txt=panel1.控件
第()类
.FirstOrDefault(x=x.Tag.ToString()=“SPEECH”);
如果(txt!=null)
{
SpVoice vc=新的SpVoice();
Speak(txt.Text,SpeechVoiceSpeakFlags.SVSFDefault);
}
其他的
{
Show(“先按创建按钮!”);
}
}
如果需要,还可以使用相同的按钮事件处理程序。检查具有指定标记的控件是否存在,如果不存在,则创建它,如果存在,则执行语音通话

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);
    }
}
private void btnAdd\u单击(对象发送者,事件参数e)
{
TextBox txt=panel1.控件
第()类
.FirstOrDefault(x=x.Tag.ToString()=“SPEECH”);
如果(txt!=null)
{
SpVoice vc=新的SpVoice();
Speak(txt.Text,SpeechVoiceSpeakFlags.SVSFDefault);
}
其他的
{
TextBox TextBox=新建TextBox();
.....
textbox.Name=“textbox”+(计数+1);
textbox.Tag=“SPEECH”;
....
panel1.控件.添加(文本框);
}
}
编辑 这假设只有一个文本框设置了语音标记。如果你想要一个以上的文本框,那么你应该能够说出你想要“交谈”的文本框(在文本框右侧添加一个带有扬声器图像的小按钮),或者在所有带有语音标签的文本框上循环,并为每个文本框呼叫Speak

像这样的

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);
    }
}
var speechbox=panel1.控件
第()类
.其中(x=x.Tag.ToString()=“SPEECH”);
如果(语音信箱!=null)
{
SpVoice vc=新的SpVoice();
foreach(演讲框中的文本框txt)
{
Speak(txt.Text,SpeechVoiceSpeakFlags.SVSFDefault);
//不确定您是否还需要添加此呼叫。。。。
vc.WaitUntilDone(10000);
}
}

不清楚添加的文本框是否与按钮所在的格式相同。如果是这种情况,则无法在form load事件中使用不存在的文本框。你能澄清这一点吗?是的。textbox和按钮的格式相同,但在form_load事件中,textbox不存在。你不能用它。也许您需要一个不同的按钮来执行当前处于加载事件形式的代码,那么同样的问题也会出现。我无法在后端代码中访问这些文本框@Steven你能不能把Form1_load中的代码移到brnAddClick?当然不能。这假设只有一个包含语音的文本框。如果你想要一个以上的文本框,那么你应该能够说出你想要“交谈”的文本框,或者在所有带有SPEECH标签的文本框上循环,并为每个文本框调用Speak。