WPF中如何从StackPanel获取动态创建的TextBox名称及值
WPF动态创建TextBox后的名称与值获取方案
问题根源
WPF中的StackPanel没有WinForms里的Controls属性,你之前的代码误用了WinForms的API,这是导致错误的核心原因。另外你创建的TextBox名称是Bet1、Bet2这类格式,而非代码中写的txtBet,名称匹配也存在问题。
三种可行解决方案
方案1:使用FindName精准查找
利用控件的FindName方法,通过设置的Name属性定位目标TextBox:
private void cboRunder_SelectionChanged(object sender, SelectionChangedEventArgs e) { var cboRunder = sender as ComboBox; string strRunder = cboRunder.SelectedValue.ToString(); switch (strRunder) { case "Blinds": // 查找名称为Bet1的TextBox TextBox targetTxt = panelBet.FindName("Bet1") as TextBox; if (targetTxt != null) { string textBoxValue = targetTxt.Text; // 这里添加你的业务逻辑 } break; } }
注意:调用
FindName前,TextBox必须已经通过panelBet.Children.Add()添加到可视化树中,否则无法找到。
方案2:遍历Children集合筛选所有TextBox
如果需要批量获取所有动态创建的TextBox的名称和值,可以遍历panelBet.Children集合,筛选出TextBox类型的元素:
private void cboRunder_SelectionChanged(object sender, SelectionChangedEventArgs e) { var cboRunder = sender as ComboBox; string strRunder = cboRunder.SelectedValue.ToString(); switch (strRunder) { case "Blinds": foreach (var child in panelBet.Children) { if (child is TextBox txt) { string txtName = txt.Name; string txtValue = txt.Text; // 处理每个TextBox的名称和值 } } break; } }
方案3:提前存储TextBox引用(推荐)
在创建TextBox时,将它们存入一个集合,后续直接从集合中获取,避免遍历或查找的开销:
- 先在类中定义集合:
private List<TextBox> _dynamicTextBoxes = new List<TextBox>();
- 修改创建TextBox的代码,将实例加入集合:
int f = 1; foreach (TextBox txt2 in txtBet) { string name = "Bet" + f.ToString(); txt2.Name = name; txt2.Text = name; // 其他属性设置... panelBet.Children.Add(txt2); _dynamicTextBoxes.Add(txt2); // 添加到集合 f++; }
- 后续取值时直接操作集合:
private void cboRunder_SelectionChanged(object sender, SelectionChangedEventArgs e) { var cboRunder = sender as ComboBox; string strRunder = cboRunder.SelectedValue.ToString(); switch (strRunder) { case "Blinds": // 获取指定名称的TextBox var targetTxt = _dynamicTextBoxes.FirstOrDefault(txt => txt.Name == "Bet1"); if (targetTxt != null) { string textBoxValue = targetTxt.Text; } // 或者遍历所有动态TextBox foreach (var txt in _dynamicTextBoxes) { string name = txt.Name; string value = txt.Text; } break; } }
额外注意事项
- 动态创建的TextBox的
Name属性必须保证唯一,避免出现重名导致查找错误 - 方案3的性能最优,尤其当
panelBet中子元素数量较多时,推荐使用
内容的提问来源于stack exchange,提问作者Jens Barfred
相关产品推荐
相关产品推荐

