2012-04-25 18 views
6

Ben etkin preslenmiş Panel1 bir düğme ile bir SplitContainer olan VS2008 basit kullanıcı denetimi (değil WPF) oluşturmak çalışıyorum Panel2Collapsed özelliğini değiştirir ve büyüklüğüne kontrolünü boyutlandırır Panel1. İşte UserControl'ın çalışma zamanı genişlik ve yükseklik

kontrolünün çıplak kemikleri şunlardır:

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; 
} 

sorun Runtime this.Height kontrolü oldukça Tasarım zamanlı olarak belirlenmiştir olandan, Kullanıcı Kontrol Designer'daki değerdir olmasıdır ana formun tasarımcısı.

Herhangi bir yardım büyük memnuniyetle karşılanacaktır. Sen denetimin yükseklik özelliğini okuduğunuz

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

Önerdiğim çözüm sizin için çalıştı mı? –

+1

Sadece ikinci çözümünüzü test ettik ve biraz değişiklik yaparak işe yarıyor. Cevabınızı değiştirilen çözümümle güncellemek doğru bir uygulama mı? –

+0

Sadece kendi başlığınızda na ** Güncelleme ** yapın ve sahip olduğunuz cevap ve bazı açıklamalarla birlikte güncelleyin :). –

cevap

5

: Lucas'ın çözümü itibaren ardından

GÜNCELLEME

, bu şekilde _openHeight yalnızca istenen etkiye neden kez ayarlanabilir demektir kurucudur, yani formda gösterilmeden ÖNCE. Mesele, kontrolün formda gösterilmesi gerektiğinde boyutun ayarlandığı görülmektedir. Bundan önce, şimdi kontrol edeceğiniz kontrol tasarımcısında bir değer.

sorunu çözmek için en kolay yolu size, denetimin yapıcı dışına open parametresini almak Open başlatır yeni bir yöntem ekleyebilirsiniz yani denetimi zaten formda çizilmiş emin olduğunuzda Height değerini okumaktır ve _closedHeight ve formu Load olayında arayın. Böyle

şey:

public MyUserControl() 
{ 
    InitializeComponent(); 
} 

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

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

Sonra formun Load olaydan AdjustControlSize yöntemini çağırın. Ayrıca, uygun Height okumak için kontrolün kendi etkinlikleri kullanabilirsiniz eventing mekanizması

ile

Çözüm. Bu şekilde Form kodundaki herhangi bir şeyi değiştirmek zorunda kalmazsınız.

Yani, bu durumda, kodu (Ben bu olsa test değil) şöyle olabilir:

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; 
} 

Bu şekilde kontrolü öz kendisi boyutu her değiştiğinde ayarlayabilirsiniz.

İlgili konular