- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试制作一个面板来托管动态添加的控件。有两个注意事项:
我看到了一些在表单中居中动态控件的提议解决方案,但出于以下原因拒绝了这些解决方案:
我想知道我是否缺少一些可以帮助我处理增长/收缩事件而无需创建我自己的 TableLayoutPanel 变体的功能?
编辑:
以下是功能草案:
最佳答案
这是一个重现您描述的行为的示例。
它使用承载多个 FlowLayoutPanel 的 TableLayoutPanel。
一个重要的细节是子 FlowLayoutPanel 的锚定:它们需要锚定到 Top-Bottom:这会导致面板位于 TableLayoutPanel 行的中心。
请注意,在 Form 构造函数中, RowStyles
之一 被删除。这也很重要:TLP
(这是一个非常古怪的家伙),即使你只有一行(或一列,同样的事情),也会保留 2 RowStyles
.第二种样式将应用于您添加的第一行;只针对第一个,而不是其他的:这会搞砸布局。
另一个异常,它没有提供删除行的方法,所以我做了一个。它具有功能但很简单,需要扩展,包括进一步验证。
请参阅有关当前功能的图形示例。如果您在实现其他方面需要帮助,请发表评论。
要构建它,请将以下控件添加到表单(此处称为 FLPTest1
):
Dock.Bottom
.右键单击并 SendToBack()
,TableLayoutPanel
(此处称为 tlp1
),设置:
AutoScroll = true
, AutoSize = true
,AutoSizeMode = GrowAndShrink
, Dock.Fill
FlowLayoutPanel
(此处称为 flp1
),位于TableLayoutPanel
内.其实没必要,只是为了这个示例代码
Top, Bottom <=
这是 !important
, 没有它布局将无法正常工作:它允许将 FLP
居中在TLP
里面行,AutoSize = true
, AutoSizeMode = GrowAndShrink
btnAddControl
)btnRemoveControl
)chkRandom
)using System.Drawing;
using System.Linq;
using System.Windows.Forms;
public partial class TLPTest1 : Form
{
public TLPTest1()
{
InitializeComponent();
tlp1.RowStyles.RemoveAt(1);
}
private void TLPTest1_Load(object sender, EventArgs e)
{
PictureBox pBox = new PictureBox() {
Anchor = AnchorStyles.None,
BackColor = Color.Orange,
MinimumSize = new Size(125, 125),
Size = new Size(125, 125),
};
flp1.Controls.Add(pBox);
tlp1.Controls.Add(flp1);
}
Random rnd = new Random();
Size[] sizes = new Size[] { new Size(75, 75), new Size(100, 100), new Size(125, 125)};
Color[] colors = new Color[] { Color.Red, Color.LightGreen, Color.YellowGreen, Color.SteelBlue };
Control selectedObject = null;
private void btnAddControl_Click(object sender, EventArgs e)
{
Size size = new Size(125, 125);
if (chkRandom.Checked) size = sizes[rnd.Next(sizes.Length)];
var pBox = new PictureBox() {
Anchor = AnchorStyles.None,
BackColor = colors[rnd.Next(colors.Length)],
MinimumSize = size,
Size = size
};
bool drawborder = false;
// Just for testing - use standard delegates instead of Lambdas in real code
pBox.MouseEnter += (s, evt) => { drawborder = true; pBox.Invalidate(); };
pBox.MouseLeave += (s, evt) => { drawborder = false; pBox.Invalidate(); };
pBox.MouseDown += (s, evt) => { selectedObject = pBox; pBox.Invalidate(); };
pBox.Paint += (s, evt) => { if (drawborder) {
ControlPaint.DrawBorder(evt.Graphics, pBox.ClientRectangle,
Color.White, ButtonBorderStyle.Solid);
}
};
var ctl = tlp1.GetControlFromPosition(0, tlp1.RowCount - 1);
int overallWith = ctl.Controls.OfType<Control>().Sum(c => c.Width + c.Margin.Left + c.Margin.Right);
overallWith += (ctl.Margin.Right + ctl.Margin.Left);
if ((overallWith + pBox.Size.Width + pBox.Margin.Left + pBox.Margin.Right) >= tlp1.Width) {
var flp = new FlowLayoutPanel() {
Anchor = AnchorStyles.Top | AnchorStyles.Bottom,
AutoSize = true,
AutoSizeMode = AutoSizeMode.GrowAndShrink,
};
flp.Controls.Add(pBox);
tlp1.SuspendLayout();
tlp1.RowCount += 1;
tlp1.Controls.Add(flp, 0, tlp1.RowCount - 1);
tlp1.ResumeLayout(true);
}
else {
ctl.Controls.Add(pBox);
}
}
private void btnRemoveControl_Click(object sender, EventArgs e)
{
if (selectedObject is null) return;
Control parent = selectedObject.Parent;
selectedObject.Dispose();
if (parent?.Controls.Count == 0) {
TLPRemoveRow(tlp1, parent);
parent.Dispose();
}
}
private void TLPRemoveRow(TableLayoutPanel tlp, Control control)
{
int ctlPosition = tlp.GetRow(control);
if (ctlPosition < tlp.RowCount - 1) {
for (int i = ctlPosition; i < tlp.RowCount - 1; i++) {
tlp.SetRow(tlp.GetControlFromPosition(0, i + 1), i);
}
}
tlp.RowCount -= 1;
}
}
关于c# - 在 FlowLayoutPanel 中居中放置多行控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54542104/
是否可以使 FlowLayoutPanel 中插入的项目自动调整 FlowLayoutPanel 的大小?这是一个例子: 内部有 1 个 FlowLayoutPanel 和 3 个按钮的表单: 如果我
好好看看这个 我有一个 Top Panel,它停靠在我表单的 Top 上(AutoSize == True,AutoSizeMode == 仅增长)。在其中我有一个 FlowLayoutPanel 停
在 FlowLayoutPanel 中,我有一个标签和一个并排的文本框。当我更改 FlowLayoutPanel 的宽度时,我还希望更改文本框的宽度。这可能吗? 控件是这样放置的: [ FLOWLAY
我在父容器中有流布局面板停靠栏(填充)。父容器 DockStyle 设置为 Top。此外,我将流布局面板的 FlowDirection 属性设置为 LeftToRight,并将两个容器的 AutoSi
我有 50 张图片。我需要在 FlowLayoutPanel 中添加这些图像,换行后的第一行有 30 张图像,第二行有 20 张图像。所以我还需要在控件上显示滚动条。 我将视频分成帧(图像)并显示在
我正在使用以下代码在 FlowLayoutPanel 中动态生成控件(win 表单 - c#)。我想在内部 foreach 完成后添加换行符。var fullText = textBox1.Text;
在我的 Windows 窗体应用程序中,我使用 FlowLayoutPanel 控件向用户显示项目列表。通过让用户将控件拖动到 FlowLayoutPanel 中的所需位置,我已经能够成功地对 Flo
我在使用 FlowLayoutPanel 时遇到了很多困难。 我有一个带有 FLP(FlowLayoutPanel) 的 Winforms 应用程序和一个子控件 - 一个 tabControl(其中有
我有一个流布局面板,我也添加了一个可链接字典 只要 value.text != "somevalue"在 whcih 情况下我只想添加该行的关键。 这里是一些示例数据,并以键和值的形式输出 "Labe
我在 Visual Studio 2013 中编程,c# winform。是否可以为 FLP 中的每个按钮选择点击事件?我正在尝试做类似 Steam Library 的事情,我已经做了很多事情,现在看
我正在使用 flowlayoutpanel,出于逻辑考虑,它有很多按钮。当我调整窗口大小时,我遇到了一个问题,当窗口变小时,我无法看到所有水平排列的按钮。相反,随着窗口变小,按钮会下降到下一行。谁能帮
我在 flowlayoutpanel 上有很多按钮,然后有文本标签来打断流程。标签之前的最后一个按钮和标签本身具有 SetFlowBreak。一切正常,但我不明白的是,为什么文本标签下有这么多空间?如
.NET Framework/C#/Windows 窗体 我希望 FlowLayoutPanel 能够根据其中的控件数量自动调整其宽度或高度。如果没有足够的空间(包装其内容),它还应该更改列数/行数。
我们将属性“Dock = Dockstyle.Fill”添加到 FlowLayoutPanel 中,以便它调整大小并填充其父控件。现在我们向 FlowLayoutPanel 添加了两个 GroupBo
我们将属性“Dock = Dockstyle.Fill”添加到 FlowLayoutPanel 中,以便它调整大小并填充其父控件。现在我们向 FlowLayoutPanel 添加了两个 GroupBo
我正在研究一个 UserControl,它由一组水平排列在 flowlayoutpanel 中控件顶部的 ComboBoxes 和一个位于 flowlayoutpanel 正下方的 datagridv
抱歉,如果我遗漏了一些明显的东西,但我正在尝试从 FlowLayoutPanel - (panelName).Controls.Clear(); 中清除控件(一系列用户控件)。不幸的是,这似乎并没有调
当我们在 FlowLayoutPanel 中使用多个 ComboBox 并在 InitializeComponent() 控件重叠后增加 FontSize 时。 有解决这个问题的方法吗? 提前致谢。
我在 FlowLayoutPanel 上动态添加了 Label,代码如下: private void button1_Click(object sender, EventArgs e) {
我正在使用 Windows 窗体并尝试在 FlowLayoutPanel 上添加多个单选按钮。我可能会动态添加 10-12 个单选按钮,也可能会删除它们,但它们始终位于 FlowLayoutPanel
我是一名优秀的程序员,十分优秀!