2011-01-31 25 views
6

Tôi đang thay đổi kích thước tùy chỉnh kiểm soát của tôi bằng cách sử dụng đoạn mã sau:Làm thế nào để thay đổi kích thước một điều khiển tùy chỉnh tôi đã xây dựng

private void Form1_Resize_1(object sender, EventArgs e) 
{ 

    textBox1.Text = this.Width.ToString(); 
    textBox2.Text = (this.Height - 200).ToString(); 

    canvas21.Size = new System.Drawing.Size(this.ClientSize.Width, this.ClientSize.Height - this.Top - 15); 

    canvas21.Invalidate(); 

} 

Tôi chỉ muốn góc trên cùng bên trái của điều khiển tùy chỉnh (0, 105) để giữ nguyên vị trí và điều khiển để thay đổi kích thước cùng với biểu mẫu, nhưng vì một số lý do điều này không hoạt động. Khi tôi thay đổi kích thước điều khiển, hãy tự động thay đổi kích thước để điền vào phần còn lại của biểu mẫu.

Overview of form layout

Có cách nào để có được một danh sách tất cả những gì ảnh hưởng đến kích thước của một usercontrol. Để tìm kiếm các địa điểm khác, kích thước tôi đã đặt, mà tôi có thể đã bỏ qua?

+1

Bạn đã điều tra thuộc tính 'Dock' và' Anchor' chưa? Sử dụng một hoặc cả hai cách này dễ dàng hơn so với việc thực hiện logic thay đổi kích thước theo cách thủ công trong sự kiện 'Resize' như chúng ta đã làm trong nhiều năm trước. –

+0

@Cody - tôi đã thử cả hai, nhưng tôi không thể có được kết quả tôi muốn. Xem câu trả lời của tôi cho ho1. – Bildsoe

+0

Khá không rõ ràng những gì đang được hỏi. Đoạn mã chắc chắn là sai, nó nên sử dụng ClientSize và trừ các giá trị thuộc tính Trái và Trên của điều khiển. –

Trả lời

6

Nếu bạn muốn điều khiển luôn thay đổi kích thước bằng biểu mẫu, bạn có thể sử dụng thuộc tính Anchor để đặt nó được neo vào một hoặc nhiều mặt của biểu mẫu để bạn không phải có mã thay đổi kích thước của riêng mình (giả định rằng chức năng thay đổi kích thước tiêu chuẩn bạn nhận được với điều này phù hợp với nhu cầu của bạn).

Bạn phải đảm bảo rằng thuộc tính Dock chưa được đặt, nếu không nó có thể lấp đầy toàn bộ biểu mẫu (hoặc một bên của biểu mẫu tùy thuộc vào cài đặt).

+0

Tôi đã thử sử dụng thuộc tính Anchor, nhưng nó vẫn điền vào phần còn lại của biểu mẫu ở phía dưới và bên phải. Tôi có một tabControl ở trên cùng, một điều khiển tùy chỉnh bên dưới nó và một nhãn bên dưới điều khiển tùy chỉnh. Tôi muốn điều khiển tùy chỉnh điền vào biểu mẫu ngoại trừ 15 pixel ở dưới cùng. – Bildsoe

+0

@ bildsoe: Vậy bạn đã đảm bảo rằng thuộc tính 'Dock' chưa được đặt chưa? –

+0

@ bildsoe: Chỉ cần làm rõ, thuộc tính 'Dock' sẽ ghi đè thuộc tính' Anchor'. Nếu điều đó không được đặt trong thuộc tính, tôi sẽ tìm kiếm mã để đảm bảo rằng nó không được đặt ở nơi khác và tôi cũng đề xuất tìm kiếm qua mã cho bất kỳ trường hợp nào bạn đặt bất kỳ thuộc tính nào của điều khiển đó (bao gồm cả bên trong chính quyền điều khiển!) để xem bạn có đặt thuộc tính 'Dock' hoặc' Size' ở đâu đó trong đó có thể là lý do. –

2

Sử dụng thuộc tính Neo là cách tốt nhất để đi nếu bạn có thể đặt. Các khóa cần khóa là

left, top, right, bottom (all!) 

Neo giúp bạn kiểm soát các đơn vị x tạo thành mặt bạn đã khóa, sao cho nó luôn cách nhau một khoảng cách.

Nếu đó không phải là một lựa chọn, hoặc chỉ để có được mã của bạn đi, hãy thử này

private void Form1_Resize_1(object sender, EventArgs e) 
{ 
    textBox1.Text = this.Width.ToString(); 
    textBox2.Text = (this.Height - 200).ToString(); 

    int iTop = canvas21.Top; 
    int iLeft = canvas21.Left; 
    // - 200 - iTop keeps it 200 from the bottom, -iLeft keeps i stuck to right 
    canvas21.Size = new System.Drawing.Size(this.Width -iLeft, this.Height-200 -iTop); 
    canvas21.Left = iLeft; // move back 
    canvas21.Top = iTop; // move back 
    canvas21.Invalidate(); 
} 

Để giữ cho nó 15 pixels in the bottom, thay đổi 200 trên để 15. Hoặc, đặt nó ở 15 tại thời gian thiết kế hoặc thông qua mã, kích hoạt neo bottom.

+0

@cyberwiki - Nó không hoạt động. Tôi đang tìm kiếm những nơi mà tôi đặt kích thước hoặc Dock, nhưng không thể tìm thấy bất kỳ, vì vậy mà không có vẻ là vấn đề – Bildsoe

0

Đối với các điều khiển khác với điều khiển tùy chỉnh, bạn có thể làm cho nó thay đổi kích cỡ không? Ví dụ, nếu bạn đặt trong một richtextbox và thiết lập Anchor cho phù hợp (Tất cả) nó sẽ thay đổi kích cỡ phù hợp với bạn? Nếu nó sau đó phải có somthing fishy với kích thước của kiểm soát của bạn, NHƯNG bạn có thể có thể lừa nó bằng cách làm ...

  1. Tạo một Panel có kích thước chính xác và neo bạn muốn từ kiểm soát của bạn .
  2. Thêm điều khiển của bạn vào Bảng điều khiển và đặt Dock thành "Fill". Hiệu quả bạn sẽ điền vào bảng điều khiển của bạn với điều khiển của bạn và sử dụng bảng điều khiển để kiểm soát thay đổi kích thước trên biểu mẫu.

Nếu tất nhiên bảng điều khiển của bạn không thay đổi kích thước đúng thì điều này sẽ không hiệu quả với bạn. Cấp này có thể là một giải pháp cho một vấn đề mã cơ bản mà trong một thế giới hoàn hảo sẽ được remidied trên bản thân kiểm soát.

0

Tôi nhìn thay đổi kích thước một điều khiển người dùng, và tôi đang sử dụng rất nhiều sự kiện khác nhau để xử lý này (ví dụ. OnSizeChanged, OnFontChanged, OnTextChanged)

Tùy thuộc vào cách Hộp văn bản của bạn phù hợp trong kiểm soát của bạn sẽ làm cho sự khác biệt, nhưng nếu vùng chứa chính của bạn có thuộc tính AutoScaleMode hoặc AutoSize thì bạn có thể thấy bạn không bắt được tất cả các sự kiện có liên quan.

Tôi xin lỗi trước nếu tôi không sử dụng tia sáng vì tôi mới sử dụng loại điều này.

ps. Tôi đã không tìm thấy bài viết của bạn ban đầu như tôi đã nhìn vào thẻ Windows-forms-designer và custom-control. Tôi thực sự không biết tôi nên sử dụng thẻ nào và không thể sử dụng tất cả các khả năng khi giới hạn 5 sẽ tiếp quản!

4

Thực sự không có lý do gì để thiết lập chiều cao và sau đó neo vào mọi phía (với docking được đặt thành không) sẽ không hoạt động.

Tuy nhiên, tôi đã nhận thấy lỗi trong logic của mã được cung cấp của bạn. Bạn có:

canvas21.Size = new System.Drawing.Size(this.ClientSize.Width, this.ClientSize.Height - this.Top - 15); 

Khi nó thực sự nên là:

canvas21.Size = new System.Drawing.Size(this.ClientSize.Width, this.ClientSize.Height - this.canvas21.Top - 15); 

Bạn đã được chỉ chụp phía trên cùng của hình thức, chứ không phải phía trên cùng của canvas21, đó là những gì bạn cần.

Điều đó dường như làm chính xác những gì bạn muốn, ít nhất là từ quan điểm của tôi. Nếu nó không hoàn toàn có tác dụng, đơn giản là nó không thay đổi kích thước cho bạn hay nó có thay đổi kích cỡ với kích thước sai?

0

Dude, bạn sẽ tự đá. Bạn không muốn ClientSize.Height - Đầu trang - 15, bạn muốn ClientSize.Height - canvas21.Top - 15. Vậy đó!

private void Form1_Resize_1(object sender, EventArgs e) 
{ 
    textBox1.Text = this.Width.ToString(); 
    textBox2.Text = (this.Height - 200).ToString(); 

    canvas21.Size = new System.Drawing.Size(this.ClientSize.Width, 
     this.ClientSize.Height - canvas21.Top - 15); 

    canvas21.Invalidate(); 
} 
+0

Tôi đã chỉ ra rằng trong bài viết của tôi: P – Yetti

+0

Vâng, tôi thấy rằng sau khi tôi đã đăng. Tôi upvoted câu trả lời của bạn. –

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