C# WPF项目如何在运行时动态向窗口添加TextBox控件
问题原因
- WPF中Window的
Content属性仅支持单个子元素,你循环赋值每次都会覆盖之前的内容,所以最后只显示最后一个TextBox。 - 你XAML里的Grid没有设置
x:Name属性,后台代码无法引用这个容器对象,自然没法调用Add方法加控件。
解决步骤
- 修改MainWindow.xaml,给Grid添加名称:
<Grid x:Name="MainGrid"> <!-- 其余原有内容保持不变 --> <Button Content="Résoudre" HorizontalAlignment="Left" Margin="10,210,0,0" VerticalAlignment="Top" Click="Resoudre"/> <Button Content="Effacer tout" HorizontalAlignment="Left" Margin="75,210,0,0" VerticalAlignment="Top" Click="Effacer"/> </Grid>
- 修改MainWindow.xaml.cs代码:
把TextBox数组定义为类的公共成员,方便后续求解、清空功能调用,同时修改控件添加逻辑:
public partial class MainWindow : Window { // 将TextBox数组提升为类成员,后续业务逻辑可以直接访问 public TextBox[] SudokuCells = new TextBox[81]; public MainWindow() { InitializeComponent(); GenerateTextBoxes(); } public void GenerateTextBoxes() { // 测试生成5个的逻辑,验证没问题可以替换为下方的9*9循环 for (int i = 0; i < 5; i++) { TextBox TBox = new TextBox(); TBox.Margin = new Thickness(10 + 20 * i, 10, 0, 0); TBox.Text = i.ToString(); TBox.Width = 20; TBox.Height = 20; TBox.HorizontalAlignment = HorizontalAlignment.Left; TBox.VerticalAlignment = VerticalAlignment.Top; // 核心:将控件添加到Grid的子元素集合 MainGrid.Children.Add(TBox); SudokuCells[i] = TBox; } // 生成完整81个格子的代码,测试通过后替换上面的单循环即可 // for (int row = 0; row < 9; row++) // { // for (int col = 0; col < 9; col++) // { // int index = row * 9 + col; // TextBox TBox = new TextBox(); // // 按行列计算偏移量 // TBox.Margin = new Thickness(10 + 20 * col, 10 + 20 * row, 0, 0); // TBox.Width = 20; // TBox.Height = 20; // TBox.HorizontalAlignment = HorizontalAlignment.Left; // TBox.VerticalAlignment = VerticalAlignment.Top; // // 可在此处添加输入限制,仅允许输入1-9数字 // MainGrid.Children.Add(TBox); // SudokuCells[index] = TBox; // } // } } // 后续的求解、清空方法可以直接操作SudokuCells数组获取/修改格子数值 }
内容的提问来源于stack exchange,提问作者BOUHL R.
相关产品推荐
相关产品推荐

