0

我正在.NET 2.0 中编写一个应用程序,我需要FlowLayoutPanelWinForms 的功能。这是我想出的我现在正在使用的代码(主要是标签):

/// <summary>
/// Flowable layout panel
/// </summary>
public partial class FlowLayoutPanel : Panel
{
    public FlowLayoutPanel()
    {
        InitializeComponent();
    }

    /// <summary>
    /// Flow the layout of the panel. Required before presentation.
    /// </summary>
    public void Layout()
    {
        int top = 0;

        // Set control position
        foreach (Control ctrl in this.Controls)
        {
            ctrl.Top = top;
            // Account for the scrollbar
            ctrl.Width = this.Width - 17;

            top += ctrl.Height;
        }
    }
}

面板被添加到表单中(在我的例子中,是一个动态生成的标签页),然后我在表单的代码视图中添加控件,如下所示:

panel.Controls.Add(new Label() { Text = "Item name", Font = boldTahoma });
panel.Controls.Add(new Label() { Text = item.ItemName });
panel.Controls.Add(new Label() { Text = "Category", Font = boldTahoma });
panel.Controls.Add(new Label() { Text = item.Category });
panel.Controls.Add(new Label() { Text = "Quantity", Font = boldTahoma });
panel.Controls.Add(new Label() { Text = item.Quantity });

panel.Layout();

所以我想我有两个问题。它有效,但是有没有更好的方法来做到这一点(特别是我不必Layout()每次都打电话),有没有办法让标签自动高度?谢谢。

4

2 回答 2

2

您可以在所有控件上设置 Dock=DockStyle.Top,也可以使用 OwnerDraw 列表框(我使用来自 OpenNetCF.com 的列表框)。这取决于您必须显示多少项目。我发现当你有很多项目时,使用 OwnerDraw ListBox 会更快,但 Panel 方法更容易开发。

注意:在添加控件之前调用 SuspendLayout,完成后调用 ResumeLayout。

于 2009-08-14T22:25:52.633 回答
1

如果这是您的实际代码,那么它根本不是流动的。它实现了一个WPF stackPanel,你可以通过 Dock=DockStyle.Top对所有控件进行设置来获得相同的效果。Dock 在 CF 中可用。

于 2009-08-14T22:10:35.550 回答