2013-03-12 60 views
6

Tôi đang cố gắng tạo điều khiển Bảng điều khiển tùy chỉnh bằng công cụ bố cục của riêng mình. tôi cần mọi điều khiển được bổ sung vào bảng điều khiển của tôi để được thêm vào bên dưới và lấy toàn bộ chiều rộng (-padding), như dưới đây: enter image description hereBảng điều khiển tùy chỉnh với công cụ bố cục

Dưới đây là mã của tôi:

using System.Drawing; 
using System.Windows.Forms; 
using System.Windows.Forms.Layout; 

namespace VContainer 
{ 
    internal class VerticalFillList : Panel 
    { 
     public VerticalFillList() 
     { 
      AutoScroll = true; 
      MinimumSize = new Size(200, 200); 
      Size = new Size(200, 300); 
      Padding = new Padding(10); 
     } 

     private readonly VerticalFillLayout _layoutEngine = new VerticalFillLayout(); 

     public override LayoutEngine LayoutEngine 
     { 
      get { return _layoutEngine; } 
     } 

     private int _space = 10; 

     public int Space 
     { 
      get { return _space; } 
      set 
      { 
       _space = value; 
       Invalidate(); 
      } 
     } 
    } 

    internal class VerticalFillLayout : LayoutEngine 
    { 
     public override bool Layout(object container, LayoutEventArgs layoutEventArgs) 
     { 
      var parent = container as VerticalFillList; 

      Rectangle parentDisplayRectangle = parent.DisplayRectangle; 
      Point nextControlLocation = parentDisplayRectangle.Location; 

      foreach (Control c in parent.Controls) 
      { 
       if (!c.Visible) 
       { 
        continue; 
       } 

       c.Location = nextControlLocation; 
       c.Width = parentDisplayRectangle.Width; 
       nextControlLocation.Offset(0, c.Height + parent.Space); 
      } 
      return false; 
     } 
    } 
} 

Trên đang hoạt động tốt , ngoại trừ một điều: khi tôi thêm điều khiển vào vùng chứa của mình, chúng được thêm chính xác (mới dưới cha mẹ, chiều rộng 100%), nhưng khi chiều cao của điều khiển lớn hơn chiều cao vùng chứa của tôi, tôi nhận thanh cuộn ngang, nhưng sau khi thêm điều khiển cặp nhiều thanh cuộn được loại bỏ. adding components

Cùng một điều sẽ xảy ra khi tôi muốn thay đổi kích thước container của tôi: resizing container

Làm thế nào điều này có thể được cố định? Tôi chỉ cần loại bỏ thanh cuộn ngang đó.

Tất nhiên tất cả những cải tiến được hoan nghênh :)

Tôi không muốn sử dụng bố trí bàn hay chảy bố trí như một này mang lại cho tôi chính xác khi nào tôi cần.

Tôi cần một thùng chứa đơn giản đặt hàng tất cả các điều khiển con từ trên xuống dưới và trải dài theo chiều ngang để chúng có chiều rộng nhiều nên thanh cuộn ngang không cần thiết.

+0

nhưng nếu nó được cố định, bạn có thể không đưa bottons tin mãi mãi ... o_o – MayogaX

+0

@MayogaX - Tôi biết điều đó :) Tôi chỉ muốn thể hiện quan điểm của mình. Tôi sẽ có các điều khiển tùy chỉnh thay vì các nút. Quan điểm của tôi là cho thấy cách hoạt động của bảng điều khiển. Hầu hết thời gian tôi sẽ có 2-3 điều khiển trong đó, nhưng khi người dùng sẽ thêm mới, tôi muốn tránh tình huống khi thanh cuộn ngang có thể nhìn thấy được. Tình huống tương tự với việc thay đổi kích thước ứng dụng của tôi. Tôi sẽ giữ tối đa 5-6 điều khiển trong đó. Trên đây chỉ là một bản demo để hiển thị hành vi không mong muốn. – Misiu

+2

Bạn đang cố gắng giải quyết vấn đề mà các nhà thiết kế Winforms cẩn thận bên bước trong lớp LayoutEngine của họ. Các bố cục như thế này là * bi-ổn định *. Các kết quả điển hình nhất của cố gắng để giải quyết nó là bị mắc kẹt trong một vòng lặp vô tận với thanh cuộn ngang nhấp nháy và tắt. Bạn đang kinda doomed để tái tạo lại các lớp học và cuối cùng làm nó theo cùng một cách. –

Trả lời

3

Dưới đây là một ví dụ làm việc mà không may, không sử dụng lớp Layout Engine của bạn. Nó chỉ đơn giản dựa vào các phương pháp OnControlAdded và OnControlRemoved, và neo đậu và thiết lập thuộc tính AutoScrollMinSize cụ thể chắc chắn rằng các thanh cuộn ngang không bao giờ xuất hiện:

internal class VerticalPanel : Panel { 
    private int space = 10; 

    public int Space { 
    get { return space; } 
    set { 
     space = value; 
     LayoutControls(); 
    } 
    } 

    protected override void OnControlAdded(ControlEventArgs e) { 
    base.OnControlAdded(e); 
    LayoutControls(); 
    } 

    protected override void OnControlRemoved(ControlEventArgs e) { 
    base.OnControlRemoved(e); 
    LayoutControls(); 
    } 

    private void LayoutControls() { 
    int height = space; 
    foreach (Control c in base.Controls) { 
     height += c.Height + space; 
    } 
    base.AutoScrollMinSize = new Size(0, height); 

    int top = base.AutoScrollPosition.Y + space; 
    int width = base.ClientSize.Width - (space * 2); 
    foreach (Control c in base.Controls) { 
     c.SetBounds(space, top, width, c.Height); 
     c.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right; 
     top += c.Height + space; 
    } 
    } 
} 
+0

Công cụ bố cục chỉ là một tùy chọn hoạt động khá tốt đối với tôi, nhưng tôi gặp sự cố với thanh cuộn. Nếu giải pháp của bạn giải quyết vấn đề đó thì nó hoàn hảo cho tôi :) – Misiu

+1

Tôi đã kiểm tra Giải pháp của bạn, hoạt động như một nét duyên dáng :) điều duy nhất nên được thêm vào là ghi đè lên 'OnControlRemoved' để gọi' LayoutControls' để xóa thanh cuộn. – Misiu

-1

Bạn có thể đặt AnchorProperty tại bạn Buttons như:

button1.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top; 

Vì vậy, họ sẽ được thay đổi kích cỡ chiều ngang

+0

Tôi không cần neo cho các nút, vì công cụ bố trí của tôi xử lý vị trí của mọi thành phần trong vùng chứa. Các nút bên trong bảng điều khiển tùy chỉnh của tôi thay đổi kích thước chính xác. Những gì tôi cần làm là để loại bỏ thanh cuộn ngang, bởi vì đôi khi nó có thể nhìn thấy. – Misiu

Các vấn đề liên quan