- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以基本上我有一个游戏板,由 TableLayoutPanel 表示。 TableLayoutPanel 的每个单元格代表板上的一个空间并包含一个面板。每个 Panel 中都有一个 Label 来显示该空间中当前的内容(例如角色或建筑物),其 BackColor 表示该空间的地形类型(例如 Land、Water 等)。当玩家试图移动一个角色时,该角色可以移动的每个可能的空间都将“突出显示”。然后玩家将双击突出显示的空间之一以将角色移动到那里。
为了突出显示一个空格,我将一个面板添加到现有面板(其中已经有一个标签的面板)。
总结一下,TableLayoutPanel --> Panel --> Label, Panel。
我遇到的主要问题是我无法让“高亮面板”在其父面板中居中;它总是左上角居中。我希望能够看到父面板的部分 BackColor,以便玩家更容易决定去哪里。因此,将 Dock 设置为 Fill 不是一个选项。 highlight-Panel 比父 Panel 略小,因此可以看到父 Panel 的 BackColor 的边缘。 是的,Anchor 设置为 None。
第二个问题是我无法更改任何标签的文本颜色。我尝试在初始化时更改它,或者更直接地使用“tableLayoutPanel.GetControlFromPosition(16, 4).Controls[0].ForeColor = Color.White;”在特定位置更改它但似乎没有任何效果。
老实说,我对 super 复杂的黑客修复不感兴趣。但是,如果有一些简单的事情或我错过的事情,我将非常感谢您提供一些意见。谢谢。
这是创建 TableLayoutPanel、其中的面板以及每个面板中的标签的代码:
// Create TableLayoutPanel to hold Panels
tableLayoutPanel = new TableLayoutPanel()
{
RowCount = 1,
ColumnCount = 1,
AutoSize = true,
AutoSizeMode = AutoSizeMode.GrowAndShrink,
Location = new Point(12, 12),
Dock = DockStyle.Fill,
AutoScroll = true,
};
// Add tableLayoutPanel to the form
this.Controls.Add(tableLayoutPanel);
// Reset and add rows/columns + styles
tableLayoutPanel.RowStyles.Clear();
tableLayoutPanel.ColumnStyles.Clear();
for (int i = 0; i < rows; i++)
{
tableLayoutPanel.RowCount++;
tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
}
tableLayoutPanel.RowCount--;
for (int j = 0; j < cols; j++)
{
tableLayoutPanel.ColumnCount++;
tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
}
tableLayoutPanel.ColumnCount--;
// Add Panels to TableLayoutPanel
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
// Create new Panel
Panel space = new Panel()
{
BackColor = SystemColors.ActiveCaption,
BorderStyle = BorderStyle.FixedSingle,
Margin = new Padding(0),
Size = new Size(45, 45)
};
space.MouseClick += new MouseEventHandler(clickOnSpace);
// Create new Label
Label info = new Label()
{
Size = new Size(93, 93),
Text = "Info",
Dock = DockStyle.Fill,
TextAlign = ContentAlignment.MiddleCenter,
Enabled = false,
Font = new Font("Microsoft Sans Serif", 6),
ForeColor = Color.White
};
// Add Label to Panel
space.Controls.Add(info);
// Add Panel to TableLayoutPanel
tableLayoutPanel.Controls.Add(space, j, i);
}
}
以及创建高亮面板的代码:
// Highlight potential positions using possibleMoves
private void Highlight(List<Tuple<int, int>> possibleMoves, int remaining)
{
int r = 0;
int c = 0;
foreach (Tuple<int, int> pair in possibleMoves)
{
r = pair.Item1;
c = pair.Item2;
// If highlight-Panel doesn't already exist
if (tableLayoutPanel.GetControlFromPosition(c, r).Controls.Count == 1)
{
// Create a Panel to highlight the space
Panel highlight = new Panel()
{
Name = "highlight",
Size = new Size(30, 30),
BackColor = Color.Yellow,
Anchor = AnchorStyles.None
};
highlight.MouseDoubleClick += new MouseEventHandler(doubleClickOnSpace);
// Add highlight Panel to space Panel
tableLayoutPanel.GetControlFromPosition(c, r).Controls.Add(highlight);
// Bring highlight Panel to front
tableLayoutPanel.GetControlFromPosition(c, r).Controls[1].BringToFront();
}
}
}
最佳答案
... Thus, setting Dock to Fill is not an option.
事实上,我认为将 Dock
设置为 Fill
确实是一个不错的选择!
看看这张图片。这是一个具有 2 列和 2 行的 TableLayoutPanel
。每个单元格都包含一个 Pannel
,其中包含一个 Panel
,其中包含一个 Label
。尽管您期望所有控件的 Dock
属性已设置为 Fill
!
我告诉您第一个单元格的设置,您可以在其中看到 Red
、Black
和 White
颜色。
单元格包含:
红色区域,一个 Panel
有:
○ BackColor
属性设置为 Red
○ Margin
属性全部设置为 0
○ Padding
属性全部设置为 5
○ Dock
属性设置为 Fill
黑色区域,一个面板
有:
○ BackColor
属性设置为 Black
○ Margin
属性全部设置为 0
○ Padding
属性全部设置为 5
○ Dock
属性设置为 Fill
白色标签,一个 Label
具有:
○ BackColor
属性设置为 White
○ Margin
属性全部设置为 0
○ Padding
属性全部设置为0
○ Dock
属性设置为 Fill
其他cell的结构完全一样,只是Label
的BackColor
和它的parent(比如黑色的),改为Transparent
,所以您会看到最里面的 Panel
的 BackColor
(如红色面板)。
注意
答案完全基于将 Dock
属性设置为 Fill
并为停靠控件设置合适的 Padding
值。但是还有另一种优雅的解决方案可以自动将控件保持在容器的中心,它基于使用具有 1 行和 1 列的 TableLayoutPanel
而不是面板,然后设置 Anchor
子属性为 None
。这样, child 将在 TableLayoutPanel
中水平和垂直居中。你会发现这篇关于它的帖子很有用:
关于c# - 在 C# 中的 TableLayoutPanel 中的面板中居中面板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38977383/
我有一个名为 tlpMaster 的 tableLayoutPanel。它有 4 列和 8 行。在 3 列和每一行中,它都有另一个 tableLayoutPanel。所以这就是 3 个内部的。在那些里
我有一些 TableLayoutPanel,其中第一个“层”有 1 列和 10 行,其中一些行包含 UserControl 或另一个具有 2 或 3 列和一些行的 TableLayoutPanel。其
我正在使用 TableLayoutPanel 将客户区域分为 3 行(只有 1 列)。顶排和底排设计为固定高度;它们将包含一个页眉和一个页脚,最初每个页脚都包含一个包含静态文本的子标签控件(只是开始)
有了 TableLayoutPanel 的所有属性,我不知道为什么这不能简单。 我有一个包含两列的 tableLayoutPanel。我试图在第一列内放置一个标签以将其用作标题。我想将它放置在相对于该
我有一个 WinForms 应用程序,它正在从 BackgroundWorker 更新 TableLayoutPanel。根据设备输入是打开 (1) 还是关闭 (0),颜色和一些文本会相应地更改。 t
如果内容高于面板本身,我希望能够在 TableLayoutPanel 内滚动。 我试过: 将 AutoScroll 设置为 true(添加 unnecessary horizontal scrollb
我有一个 TableLayoutPanel,它具有由用户确定的动态数量的列和行。我希望里面的按钮是方形的并且大小相同,但是每当我使用循环来设置列/行样式时,它们永远不会变成我想要的大小。 如何获取列/
在我的应用程序中,我有一个名为“Dashboard.cs”的 WindowsForm,其中有一个名为 dashboardTableItemsWrapper 的 TableLayoutPanel。现在,
我有几个 TableLayoutPanel,每个都在两列中显示一类名称/值信息 - 一列带有信息标签,一列带有数据标签。 在每一个中,我都将第一列设置为自动调整大小并右对齐所有标签,效果很好。但是,它
我有一个 TableLayoutPanel,它在运行时使用文本文件填充行(从文本文件中获取每一行,并将其放入新行中包含的单元格中)。代码看起来像这样: public static string Url
我想在 GUI 的固定区域中的 TableLayoutPanel 中动态添加行。所以,如果记录数量增加,那么我想要一个垂直滚动条来帮助用户查看更多记录。为此,我设置了 PropertyAutoScro
我有一个 TableLayoutPanel,我可以向其中动态添加行。 每行都有一个绝对大小。 我将 AutoScroll 设置为“true”,但是当我添加超出 TableLayoutPanel 显示范
我有一个 TableLayoutPanel,每次我将标签放入其中一个单元格时,它都会捕捉到左上角。我怎样才能到达它而不是这样做或改变它捕捉的位置。 此外,是否可以更改特定单元格的背景颜色? 谢谢! 最
我正在创建一个表格布局面板来显示字典中的值,但表格布局面板一直将我放入单元格中的标签控件截断为 14 个字符。我试图摆弄我的表格布局面板的 ColumnStyles,但没有任何选项会使 Label 控
我在 C#(窗体)中使用 TableLayoutPanel。我的表格很大,有 33 列和 8 行。所有单元格都包含 Label 对象。 我已经通过创建一个新的子类设置了我的 TableLayoutPa
是否可以让 System.Windows.Forms.TableLayoutPanel 在移动到下一列之前填充一列?无论我如何设置 RowCount、ColumnCount 和 GrowStyle,表
我正在使用 TableLayoutPanel 和 anchor 属性来制作一个独立于屏幕分辨率或窗体大小调整而看起来不错的窗口应用程序。我提到了 this article为了设计winform。 我的
我向我的用户控件添加了一个 tableLayoutPanel。 It is not docked or anchored. It has 4 columns and 4 rows. The items
我有 TableLayoutPanel 用于通过 AutoScroll = true 动态创建控件。当我添加新控件时它工作正常。但是当我删除并且所有控件都可见时,垂直滚动是可见的。这里有一些截图: 预
我可能没有使用我想要的正确控件。我正在用控件填充表格,我希望每一列的大小自动适应其中包含的控件。例如,一列文本框将比一列复选框宽。由于不同操作系统、不同 DPI、不同字体等的复杂性,我不想摆弄测量,如
我是一名优秀的程序员,十分优秀!