2010-05-04 41 views
5

Một ToolStripComboBox được đặt sau một ToolStripButton và được folowed bởi một số khác, được căn phải. Làm thế nào để tôi thiết lập ToolStripComboBox tốt nhất để luôn điều chỉnh độ dài của nó để lấp đầy tất cả các khoảng trống có sẵn giữa tiền tố và các ToolStripButtons có hại?Làm thế nào để tạo một ToolStripComboBox để lấp đầy tất cả không gian có sẵn trên một ToolStrip?

Trong quá khứ tôi đã sử dụng để xử lý sự kiện thay đổi kích thước gốc, tính toán độ dài mới để đặt dựa trên tọa độ phần tử lân cận và đặt kích thước mới. Nhưng bây giờ, khi tôi đang phát triển một ứng dụng mới, tôi tự hỏi nếu không có cách nào tốt hơn.

Trả lời

1

Không có tùy chọn bố cục tự động cho việc này. Nhưng bạn có thể dễ dàng làm điều đó bằng cách triển khai sự kiện ToolStrip.Resize. Điều này hoạt động tốt:

private void toolStrip1_Resize(object sender, EventArgs e) { 
     toolStripComboBox1.Width = toolStripComboBox2.Bounds.Left - toolStripButton1.Bounds.Right - 4; 
    } 
    protected override void OnLoad(EventArgs e) { 
     toolStrip1_Resize(this, e); 
    } 

Đảm bảo đặt thuộc tính AutoResize của TSCB thành False hoặc không hoạt động.

+0

Đây là một vấn đề (tôi không thể nhớ là mình đã có quá khứ như vậy, khi tôi đang sử dụng V2005). Trên mỗi ý nghĩa kỳ lạ (hiệu ứng không diễn ra nếu chênh lệch kích thước nhỏ như vài pixel hoặc hơn) kích thước giảm ToolStripComboBox biến mất (xuất hiện nếu tôi giảm nó một lần nữa (và sẽ biến mất một lần nữa nếu tôi giảm nó một lần nữa) hoặc tăng nó). AutoResize được đặt thành false, tăng một chữ số được trừ (là 4 trong ví dụ của bạn) không giúp được gì. ToolStrip nằm bên trong một bảng điều khiển SplitContainer và được thay đổi kích cỡ mỗi khi một mannel được thay đổi kích thước bằng cách kéo bộ tách SplitContainer. – Ivan

+0

Trường hợp xảy ra phổ biến nhất của mẫu sự cố mà tôi mô tả là khôi phục biểu mẫu từ trạng thái tối đa - cả hai ToolStripComboBoxes (trong bảng điều khiển bên trái và trong bảng bên phải) sẽ biến mất trong trường hợp này. – Ivan

+0

Để ngăn chặn 'ToolStripComboBox' bị biến mất sau khi' User Form' được thay đổi kích thước từ trạng thái tối đa, tôi đã sử dụng hack này: 'ToolStripComboBox.Visible = false; ToolStripComboBox.Visible = true; 'bên trong trình xử lý sự kiện' toolStrip1_Resize' ngay sau 'toolStripComboBox1.Width = ...'. HTH – dee

5

tôi sử dụng sau đây với thành công rực rỡ:

private void toolStrip1_Layout(System.Object sender, System.Windows.Forms.LayoutEventArgs e) 
{ 
    int width = toolStrip1.DisplayRectangle.Width; 

    foreach (ToolStripItem tsi in toolStrip1.Items) { 
     if (!(tsi == toolStripComboBox1)) { 
      width -= tsi.Width; 
      width -= tsi.Margin.Horizontal; 
     } 
    } 

    toolStripComboBox1.Width = Math.Max(0, width - toolStripComboBox1.Margin.Horizontal); 
} 

Đoạn mã trên không gặp phải vấn đề kiểm soát disapearing.

+2

Sử dụng VS2010/.NET 4: Nếu tôi thay đổi kích thước biểu mẫu rất nhanh, tôi vẫn nhận được sự cố kiểm soát biến mất. Nhưng nó dễ dàng được giải quyết bằng cách thêm toolStrip1.PerformLayout() vào trình xử lý sự kiện thay đổi kích thước của biểu mẫu. –

+0

Điều này có vẻ không hoạt động đúng khi sử dụng thiết lập dpi khác hơn 96 dpi. Chiều rộng sẽ được thu nhỏ sau khi đặt nó làm cho nó quá lớn. – kjbartel

1
ToolStrip ts = new ToolStrip(); 

ToolStripComboBox comboBox = new TooLStripComboBox(); 
comboBox.Dock = DockStyle.Fill; 

ts.LayoutStyle = ToolStripLayoutStyle.Table; 
((TableLayoutSettings)ts.LayoutSettings).ColumnCount = 1; 
((TableLayoutSettings)ts.LayoutSettings).RowCount = 1; 
((TableLayoutSettings)ts.LayoutSettings).SetColumnSpan(comboBox,1); 

ts.Items.Add(comboBox); 

Giờ đây, combobox sẽ cập nhật chính xác. Đặt Độ dài cột hoặc Hàng tương ứng.

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