我正在开发一个具有如下分层界面的 WinForms 应用程序:
忽略面板 A。旁边我有一个带有 2 个选项卡的 TabControl。在第二个选项卡的 TabPage 上,我在顶部有一些用于过滤数据的控件,在其下方有面板 B,它是一个 FlowLayoutPanel,它显示来自数据库的记录列表。每条记录都显示在面板 C 中,面板 C 包含各种文本字段,具体取决于记录的内容。
加载时 UI 看起来相当不错(但请参阅下面的问题 #2)。我正在努力解决的第一个问题是正确处理主窗口的调整大小事件。当用户拖动主窗口的一侧使其变宽时,主窗体会调整 TabPage 和 Panel B 的大小,然后调用 Panel B 上的方法来调整其内容的大小。TabPage 顶部的控件根据其设置自动均匀地分布在顶部。到目前为止,一切都很好。
面板 B 遍历其 C 面板列表,调整每个面板的宽度。(稍后我将为 C Panel 添加代码以相应地调整每个文本字段的宽度。)
但目前,我遇到了两个可能相关的问题:
我似乎无法让 C 面板改变它们的宽度。我最初希望通过正确的 AutoSize、AutoScroll 等设置,我可以得到我想要的,但是当这不起作用时,我决定添加一个 resize 事件处理程序来获得更多控制权。这目前无法正常工作。
甚至在调整大小之前,我将面板 B 的宽度设置为适合 TabPage,并将面板 B 的 FlowDirection 设置为 FlowDirection.TopDown,但是一旦有足够的 C 面板超过面板 B 的高度,面板 B 变为双倍宽度,其中有第二列 C 面板。我真正想要的是添加一个垂直滚动条来滚动“TopDown”列表。
当我将面板 B 的 AutoScroll 设置为 true 时,我没有得到垂直滚动条(这是我期望的 TopDown 面板);相反,我得到了一个水平滚动条,面板向右增长!所以我关闭了自动滚动。
这是一些相关的代码:
class MainForm : Form
{
private int priorHeight;
private int priorWidth;
private System.Windows.Forms.TabPage MyTabPage;
private SelectableListPanel PanelB = null;
...
private void OnResize(object sender, EventArgs e)
{
this.SuspendLayout();
int vDiff = this.Height - priorHeight;
int hDiff = this.Width - priorWidth;
MyTabPage.Height += vDiff;
MyTabPage.Width += hDiff;
PanelB.Height += vDiff;
PanelB.Width += hDiff;
// tell PanelB to resize its record panels
PanelB.PropagateResize(hDiff);
ResumeLayout(false);
PerformLayout();
priorHeight = this.Height;
priorWidth = this.Width;
}
}
class SelectableListPanel : FlowLayoutPanel
{
protected List<Panel> panels = new List<Panel>();
public SelectableListPanel(List<Panel> Panels) : base()
{
FlowDirection = FlowDirection.TopDown;
AutoScroll = false;
AutoSize = false;
panels = Panels;
}
...
public void PropagateResize(int hDiff)
{
foreach (Panel genPanel in panels)
{
genPanel.Width += hDiff;
// TODO: genPanel.PropagateResize(hDiff)
}
}
}
有什么想法/建议吗?