2010-04-23 20 views
5

Có bất kỳ điều khiển thay thế nào mà ai đó có thể đề xuất để thay thế Trình phân tách WinForms không? Tôi không thích cách SplitContainer cho thấy dải phân cách kỳ lạ khi nó được chọn và khi nó được kéo. Tôi muốn có các bảng kích thước lại khi người dùng kéo thay vì bật chuột lên và không hiển thị bất kỳ dải chấm nào khi bộ chia đang được kéo. Về cơ bản như thế nào tất cả các kích thước lại của tấm được thực hiện trong cửa sổ thám hiểm trên vista.WinForms: Thay thế cho SplitContainer?

Đây là điều chấm Tôi đang nói về:

splitter

Trả lời

8

Viết UserControl chia đựng của riêng bạn. Bạn về cơ bản chỉ cần thả hai Panels vào điều khiển (cho các tấm bên trái và bên phải) và sau đó để khoảng cách giữa chúng là splitter. Một ít MouseDown, MouseMove và MouseUp logic trên UserControl chính nó sẽ cho phép bạn dễ dàng di chuyển các "splitter" trái và phải, và hai tấm sẽ đúng chặn ở khắp mọi nơi, nhưng trên splitter, do đó, logic của bạn để kiểm tra nếu con chuột nếu trên splitter là đơn giản như có thể được.

Có thể có thêm một chút công việc để kiểm soát hoạt động theo cách bạn muốn nó hoạt động trong chế độ thiết kế.

+0

Vâng, tôi đang đưa ra một thử này, tuy nhiên, với sự kiện MouseMove trên sự kiểm soát, sự kiện này sẽ ngừng bắn nếu chuột được di chuyển quá nhanh và nó đi qua một trong các bảng. Có cách nào để làm cho các sự kiện di chuyển chuột bong bóng lên đến sự kiểm soát hoặc có sự kiểm soát bắt tất cả các sự kiện di chuyển chuột? – Telanor

+0

Nevermind, tôi chỉ nối các sự kiện MouseMove của tất cả các điều khiển với cùng chức năng. Nó đã làm việc ra tốt – Telanor

+0

Tôi nên có công phu rằng ngoài việc xử lý các sự kiện chuột, bạn cũng muốn một bool hoặc một cái gì đó để lưu trữ cho dù nút chuột hiện đang xuống hay không (như trong câu trả lời của Hans). Nếu bạn bấm và giữ nút chuột trên một điều khiển, nó sẽ tạo ra một sự kiện MouseDown trên điều khiển đó. Nếu bạn giữ nút chuột xuống và kéo sang trái hoặc sang phải (hoặc lên hoặc xuống, cho vấn đề đó), tất cả các sự kiện MouseMove sẽ được tạo bởi điều khiển mà bạn đã nhấp vào, ngay cả khi con trỏ chuột rời khỏi điều khiển gốc và biểu mẫu gốc. – MusiGenesis

1

Bạn không thể tinker với SplitContainer. Một khả năng là loại bỏ nó hoàn toàn nếu bạn chỉ sử dụng nó để thay đổi kích thước một điều khiển. Thay vào đó, bạn có thể sử dụng các sự kiện chuột trên chính điều khiển. Thả TreeView trên một biểu mẫu và gắn nó vào bên trái. Theo dõi các MouseDown/Move/Sự kiện và viết một cái gì đó như thế này:

bool mDragging; 

    private bool onTreeEdge(Point pos) { 
     return pos.X >= treeView1.DisplayRectangle.Right - 3; 
    } 
    private void treeView1_MouseMove(object sender, MouseEventArgs e) { 
     treeView1.Cursor = mDragging || onTreeEdge(e.Location) ? Cursors.VSplit : Cursors.Default; 
     if (mDragging) treeView1.Width = e.X; 
    } 
    private void treeView1_MouseDown(object sender, MouseEventArgs e) { 
     mDragging = onTreeEdge(e.Location); 
     if (mDragging) treeView1.Capture = true; 
    } 
    private void treeView1_MouseUp(object sender, MouseEventArgs e) { 
     mDragging = false; 
    } 
5

Tôi thấy điều này sau khi tôi thấy câu hỏi của bạn, vì vậy nghĩ tôi sẽ chia sẻ: SplitContainer FAQ

Các liên kết thứ hai trên có nói chính xác bạn cần gì để làm.

Đây là văn bản từ đó chỉ trong trường hợp liên kết bị chết.

//1. Use the custom control defined in the SplitContainerNoFocus sample 
//2. Insert the following code in your project, and attach these events to all of the SplitContainers that you don't want stealing focus. 

// Temp variable to store a previously focused control 
private Control focused = null; 

private void splitContainer_MouseDown(object sender, MouseEventArgs e) 
{ 
    // Get the focused control before the splitter is focused 
    focused = getFocused(this.Controls); 
} 

private Control getFocused(Control.ControlCollection controls) 
{ 
    foreach (Control c in controls) 
    { 
     if (c.Focused) 
     { 
     // Return the focused control 
     return c; 
     } 
     else if (c.ContainsFocus) 
     { 
     // If the focus is contained inside a control's children 
     // return the child 
     return getFocused(c.Controls); 
     } 
    } 
    // No control on the form has focus 
    return null; 
} 

private void splitContainer_MouseUp(object sender, MouseEventArgs e) 
{ 
    // If a previous control had focus 
    if (focused != null) 
    { 
     // Return focus and clear the temp variable for 
     // garbage collection 
     focused.Focus(); 
     focused = null; 
    } 
} 
+2

Liên kết đã chết, [đây là phiên bản zombie] (http://web.archive.org/web/20111122002109/http://windowsclient.net/blogs/faqs/archive/tags/SplitContainer/default.aspx). –

1

tôi cần giống nhau và thiết lập các thuộc tính sau:

 splitContainer1.Anchor = (AnchorStyles.Top | AnchorStyles.Left); 
     splitContainer1.Dock = DockStyle.Fill; 
     splitContainer1.IsSplitterFixed = true; 

Hope this helps.

-1

Ngoài ra, hãy xem xét các thành phần chia container mà đi kèm với tự do Krypton toolkit

+0

Liên kết đã chết. – Krythic