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;
}
Giải pháp tôi đã đề xuất có hiệu quả với bạn không? –
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? –
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ả :). –