WPF中像Grid里动态添加控件出现串行的情况

lololyuu 2024-07-24 17:55:23

代码如下:

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是记录当前控件排列到的位置,添加第一行的时候没有问题,添加第二行时,第一行的数据整体移动到了第二行,就像下图所示:

 

 不知道为什么会这样。求大佬赐教。

 

...全文
513 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

在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;
![配图](https://hunyuan-prod-1258344703.cos.ap-guangzhou.myqcloud.com/text2img/de4afd800048ccc92ecb6920a5a0fe3b/20250124060307h0_577fe4eaef1e9d36fd3a689533e0d970d12.png?q-sign-algorithm=sha1&q-ak=AKIDRl074nOsGdJ9zjMsCRWP3ShmgS3VtX4S&q-sign-time=1737669787;1769205787&q-key-time=1737669787;1769205787&q-header-list=host&q-url-param-list=&q-signature=8bdebec7055ddb4b97f9dada5905e3d6d5386cd9)
    Grid.SetRow(b, ++row);
}
...
g.Children.Add(b);

问题分析

  1. 行定义的添加

    • 你在添加新行时,使用了g.RowDefinition.Add(r);,这里应该是g.RowDefinitions.Add(r);RowDefinition是类的名称,而RowDefinitions才是Grid类中用于存储行定义的集合。
  2. 行列索引的管理

    • columnrow变量的管理非常重要。每次添加控件时,需要确保columnrow的值是正确的。如果column超过了列数,应该重置为0并增加一行。

配图


3. 控件的添加顺序

  • 确保在设置控件的行列索引之后再将其添加到Grid的子元素集合中。

改进后的代码

以下是改进后的代码示例:

Button b = new Button();
b.FontSize = 10;
Grid g = (Grid)FindName("BtnGrid");

// 确保列数不超过预设值
if (column >= g.ColumnDefinitions.Count)
![配图](https://hunyuan-prod-1258344703.cos.ap-guangzhou.myqcloud.com/text2img/de4afd800048ccc92ecb6920a5a0fe3b/20250124060307h0_450dafb546601683ff279f5da372508d253.png?q-sign-algorithm=sha1&q-ak=AKIDRl074nOsGdJ9zjMsCRWP3ShmgS3VtX4S&q-sign-time=1737669787;1769205787&q-key-time=1737669787;1769205787&q-header-list=host&q-url-param-list=&q-signature=f1687db91c4ee457ae326c00474d0ca0012c9bf5)
{
    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的高级主题,包括自定义控件、性能优化和架构设计,适合高级开发者。

书籍比较

  • 《Pro WPF 4.5》《WPF 4.5 Unleashed》 都是WPF领域的经典书籍,前者更注重理论与实践结合,后者则更全面地覆盖了WPF的各种功能。
  • 《C# 7.0 in a Nutshell》 是C#语言的必备参考书,适合所有级别的开发者,尤其是需要深入了解语言特性的开发者。
  • 《Programming WPF》 适合初学者,内容简洁易懂,能够快速上手WPF开发。
  • 《Mastering Windows Presentation Foundation》 则更适合有一定基础的开发者,深入探讨高级主题。

通过阅读这些书籍,你可以系统地学习和掌握WPF和C#的相关知识,解决实际开发中遇到的问题。

已隐藏部分内容,更多查看原文

morliz子轩 2024-07-25
  • 打赏
  • 举报
回复

你写的逻辑,我压根就没完全看懂。
很显然,你需要跟踪一下column,row这两个对象。
肯定是它在遍历时,发生变化导致有空行进去。

111,079

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧