111,079
社区成员




代码如下:
Button b = new Button();
b.FontSize = 10;
Grid g = (Grid)FindName("BtnGrid");
if(column == 4)
{
RowDefinition r = new RowDefinition();
g.RowDefinition.Add(r);
Grid.SetColunm(b,0);
column = 0;
Grid.SetRow(b, ++row);
}
.
.
.
Grid.Child.Add(b);
其中column是记录当前控件排列到的位置,添加第一行的时候没有问题,添加第二行时,第一行的数据整体移动到了第二行,就像下图所示:
不知道为什么会这样。求大佬赐教。
在WPF中使用Grid动态添加控件时出现串行(布局错乱)的情况是比较常见的问题。根据你提供的代码片段和描述,问题可能出在对Grid
的行和列的管理上。
首先,让我们分析一下你的代码逻辑:
Button b = new Button();
b.FontSize = 10;
Grid g = (Grid)FindName("BtnGrid");
if (column == 4)
{
RowDefinition r = new RowDefinition();
g.RowDefinitions.Add(r); // 注意这里是RowDefinitions
Grid.SetColumn(b, 0);
column = 0;

Grid.SetRow(b, ++row);
}
...
g.Children.Add(b);
行定义的添加:
g.RowDefinition.Add(r);
,这里应该是g.RowDefinitions.Add(r);
。RowDefinition
是类的名称,而RowDefinitions
才是Grid
类中用于存储行定义的集合。行列索引的管理:
column
和row
变量的管理非常重要。每次添加控件时,需要确保column
和row
的值是正确的。如果column
超过了列数,应该重置为0并增加一行。Grid
的子元素集合中。以下是改进后的代码示例:
Button b = new Button();
b.FontSize = 10;
Grid g = (Grid)FindName("BtnGrid");
// 确保列数不超过预设值
if (column >= g.ColumnDefinitions.Count)

{
column = 0;
}
// 如果当前行已经满了,增加新行
if (row >= g.RowDefinitions.Count)
{
RowDefinition r = new RowDefinition();
g.RowDefinitions.Add(r);
}
Grid.SetColumn(b, column);
Grid.SetRow(b, row);
// 添加控件到Grid
g.Children.Add(b);
// 更新行列索引
column++;
if (column >= g.ColumnDefinitions.Count)
{
column = 0;
row++;
}
在深入学习WPF和C#的过程中,以下几本书籍是非常值得推荐的:
推荐书籍 | 图书特点 |
---|---|
《Pro WPF 4.5》 | 作者:Matthew MacDonald,出版社:Apress。这本书详细介绍了WPF的核心概念和高级特性,适合中级和高级开发者。内容涵盖数据绑定、动画、样式和模板等。 |
《WPF 4.5 Unleashed》 | 作者:Adam Nathan,出版社:Sams Publishing。这本书全面讲解了WPF的各种功能和技巧,包括布局、控件、事件处理等。适合想要深入了解WPF的开发者。 |
《C# 7.0 in a Nutshell》 | 作者:Joseph and Ben Albahari,出版社:O'Reilly Media。这本书是C#语言的权威参考书,涵盖了C# 7.0的所有新特性和语法细节,适合所有C#开发者。 |
《Programming WPF》 | 作者:Chris Sells 和 Ian Griffiths,出版社:O'Reilly Media。这本书以简洁明了的方式介绍了WPF的基本概念和编程技巧,适合初学者。 |
《Mastering Windows Presentation Foundation》 | 作者:Sheridan Yuen,出版社:Packt Publishing。这本书深入探讨了WPF的高级主题,包括自定义控件、性能优化和架构设计,适合高级开发者。 |
通过阅读这些书籍,你可以系统地学习和掌握WPF和C#的相关知识,解决实际开发中遇到的问题。
你写的逻辑,我压根就没完全看懂。
很显然,你需要跟踪一下column,row这两个对象。
肯定是它在遍历时,发生变化导致有空行进去。