2012-04-25 49 views
6

Tôi đang cố gắng tạo một Điều khiển người dùng đơn giản (không phải WPF) trong VS2008 có hiệu quả là SplitContainer bằng một nút trong Panel1, khi được nhấn, chuyển đổi thuộc tính Panel2Collapsed và thay đổi kích thước của điều khiển Panel1.Chiều rộng và chiều cao thời gian chạy của Usercontrol

Dưới đây là xương trần của điều khiển:

private int _openHeight; 
private int _closedHeight; 

public MyUserControl(bool open) 
{ 
    InitializeComponent(); 

    _openHeight = this.Height; 
    _closedHeight = splitContainer1.SplitterDistance; 
    Open = open; 
}  

private bool _open; 
private bool Open 
{ 
    get { return _open; } 
    set 
    { 
    _open = value; 
    splitContainer1.Panel2Collapsed = !_open; 
    this.Height = _open ? _openHeight : _closedHeight; 
    } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    Open = !Open; 
} 

Vấn đề là this.Height trong Runtime là giá trị mà sự kiểm soát là trong User Control thiết kế, chứ không phải là những gì được đặt ở Thiết kế-thời gian trong nhà thiết kế của biểu mẫu chính.

Mọi trợ giúp sẽ được đánh giá cao.

CẬP NHẬT

Tiếp theo từ giải pháp Lucas', cách này có nghĩa là _openHeight chỉ thiết lập một lần, dẫn đến hiệu quả mong muốn:

private int? _openHeight; 
private int _closedHeight; 

public MyUserControl(bool open) 
{ 
    InitializeComponent(); 

    //the _closedHeight doesn't change so can be defined in the constructor 
    _closedHeight = splitContainer1.SplitterDistance; 

    //set value 
    Open = open; 

    this.SizeChanged += new EventHandler(MyUserControl_SizeChanged); 
    this.Load += new EventHandler(MyUserControl_Load); 
}  

void MyUserControl_SizeChanged(object sender, EventArgs e) 
{ 
    //this event is called BEFORE the _Load event so gets the height set in the designer 
    // and not any changes at run time (e.g. when you collapse the control) 

    if (_openHeight == null) 
    _openHeight = this.Height; 
} 

private bool _open; 
private bool Open 
{ 
    get { return _open; } 
    set 
    { 
    _open = value; 

    if (_open) 
    { 
     //sets height only if it has been initialized 
     if (_openHeight != null) 
     this.Height = (int)_openHeight; 
    } 
    else 
    { 
     this.Height = (int)_closedHeight; 
    } 
    } 
} 

void MyUserControl_Load(object sender, EventArgs e) 
{ 
    //now that control is loaded, set height 
    Open = Open; 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    Open = !Open; 
} 
+0

Giải pháp tôi đã đề xuất có hiệu quả với bạn không? –

+1

Chỉ cần thử nghiệm giải pháp thứ hai của bạn và, với một chút sửa đổi, nó hoạt động. Có thực hành thích hợp để cập nhật câu trả lời của bạn với giải pháp đã sửa đổi của tôi không? –

+0

Chỉ cần thực hiện na ** Cập nhật ** trong tiêu đề câu hỏi của bạn và cập nhật nó với câu trả lời bạn có và một số mô tả :). –

Trả lời

5

Bạn đang đọc tài sản Chiều cao của kiểm soát trong đó là hàm tạo, có nghĩa là nó có thể TRƯỚC KHI nó hiển thị trong biểu mẫu. Vấn đề là, kích thước dường như được điều chỉnh khi điều khiển cần được hiển thị trong biểu mẫu. Trước đây, đó là một giá trị được thiết lập trong nhà thiết kế của người điều khiển mà bạn đang nhận được. Cách dễ nhất để giải quyết vấn đề là đọc giá trị Height khi bạn chắc chắn rằng điều khiển đã được rút ra dưới dạng nghĩa là bạn có thể lấy tham số open ngoài hàm tạo của điều khiển, thêm phương thức mới khởi tạo Open_closedHeight và gọi số này theo số Load sự kiện của biểu mẫu.

Something như thế này:

public MyUserControl() 
{ 
    InitializeComponent(); 
} 

public AdjustControlSize(bool open) 
{ 
    _openHeight = this.Height; 
    _closedHeight = splitContainer1.SplitterDistance; 
    Open = open; 
} 

//the rest of the control's code is unchanged 
... 

Sau đó gọi AdjustControlSize phương pháp từ sự kiện hình thức của Load.

Giải pháp với cơ chế eventing

Bạn cũng có thể sử dụng các sự kiện riêng của kiểm soát để đọc Height khi thích hợp. Bằng cách này bạn không phải thay đổi bất cứ điều gì trong mã của Form.

Vì vậy, trong trường hợp này, các mã có thể giống như thế này (tôi đã không kiểm tra mặc dù điều này):

public MyUserControl(bool open) 
{ 
    InitializeComponent(); 

    _openHeight = this.Height; 
    _closedHeight = splitContainer1.SplitterDistance; 
    Open = open; 
    this.SizeChanged += new EventHandler(MyUserControl_SizeChanged); 
} 

void CustomPictureBox_SizeChanged(object sender, EventArgs e) 
{ 
    _openHeight = this.Height; 
    _closedHeight = splitContainer1.SplitterDistance; 
} 

Bằng cách này, tự kiểm soát có thể tự điều chỉnh mỗi lần kích thước của nó bị thay đổi.

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