FlowLayoutPanel в CF.NET

Я пишу приложение на .NET 2.0, и мне нужна функциональность FlowLayoutPanel из WinForms. Это код, который я придумал, который я использую прямо сейчас (в основном с метками):

/// <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()) и есть ли способ сделать метки авто-высотой? Спасибо.


person Jess    schedule 14.08.2009    source источник


Ответы (2)


Вы можете либо установить Dock=DockStyle.Top для всех ваших элементов управления, либо вы можете использовать список OwnerDraw (я использую тот, что на OpenNetCF.com). Это зависит от того, сколько элементов вы должны отобразить. Я обнаружил, что использование OwnerDraw ListBox выполняется быстрее, когда у вас много элементов, но подход Panel проще в разработке.

Одно примечание: вызовите SuspendLayout перед добавлением элементов управления и ResumeLayout, когда закончите.

person Chris Brandsma    schedule 14.08.2009

Если это ваш настоящий код, то он вообще не Flowing. Он реализует панель стека WPF, и вы можете получить тот же эффект, установив Dock=DockStyle.Top для всех элементов управления. Док доступен в CF.

person Henk Holterman    schedule 14.08.2009