CF.NET中的FlowLayoutPanel

时间:2009-08-14 19:01:05

标签: c# compact-framework user-controls flowlayoutpanel

我正在用.NET 2.0编写应用程序,我需要WinForms的FlowLayoutPanel功能。这是我现在使用的代码(主要是标签):

/// <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())并且有没有办法使标签自动高度?感谢。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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