2009-08-14 59 views
0

我在.NET 2.0中編寫應用程序,我需要WinForms中的FlowLayoutPanel的功能。這是我想出了,我現在使用(主要是與標籤)的代碼:CFL中的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

您可以在所有控件上設置Dock = DockStyle.Top,也可以使用OwnerDraw列表框(我使用OpenNetCF.com中的一個)。這取決於您必須顯示多少項目。我發現使用OwnerDraw列表框的速度更快,但是面板方法更易於開發。

一個注意事項:在添加控件之前調用SuspendLayout,完成後調用ResumeLayout。

1

如果這是您的實際代碼,那麼它根本就不是流動的。它實現了一個WPF stackPanel,並且通過爲所有控件設置Dock=DockStyle.Top可以獲得相同的效果。 Dock在CF中可用。