2012-04-25 16 views
6

Próbuję utworzyć prosty Kontrolny Użytkownika (nie WPF) w VS2008, które skutecznie jest SplitContainer z przycisku w Panel1, którego naciśnięcie przełącza właściwość Panel2Collapsed i przeskalowanie kontrolę wielkości Panel1.usercontrol szerokość wykonawcze i wysokość

Oto gołe kości kontrolą:

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

Problemem jest to, że this.Height w Runtime jest wartością których kontrola jest w kreatorze sterowania użytkownika, a nie to, co jest ustawione w czasie projektowania w główny projektant formularza.

Każda pomoc zostanie bardzo doceniona.

UPDATE

Nawiązując do rozwiązania Lucasa, w ten sposób oznacza, że ​​_openHeight jest ustawiony tylko raz, w wyniku pożądanego efektu:

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

Czy zaproponowane przeze mnie rozwiązanie było dla ciebie skuteczne? –

+1

Właśnie przetestowałem twoje drugie rozwiązanie i przy odrobinie modyfikacji działa. Czy właściwą praktyką jest aktualizacja odpowiedzi za pomocą zmodyfikowanego rozwiązania? –

+0

Po prostu narysuj na ** Update ** w nagłówku pytania i zaktualizuj go o odpowiedź, którą posiadasz i opis :). –

Odpowiedz

5

Czytasz właściwość height kontrolki w to jest konstruktor, co oznacza, że ​​prawdopodobnie PRZED jego wyświetleniem w formie. Chodzi o to, że rozmiar wydaje się być dostosowany, gdy kontrola musi być pokazana w formie. Przedtem jest to wartość ustawiona w projektorze kontrolki, który teraz dostajesz.

Najprostszym sposobem rozwiązania tego problemu jest odczytać wartość Height gdy jesteś pewien, że kontrola została już sporządzona w formie czyli można dostać open parametr z konstruktora formantu, dodać nową metodę, która inicjuje Open i _closedHeight i wywołaj go w zdarzeniu formularza Load.

coś takiego:

public MyUserControl() 
{ 
    InitializeComponent(); 
} 

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

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

Następnie zadzwonić AdjustControlSize metodę z formularza Load imprezy.

rozwiązanie z mechanizmem WKKW

Można również użyć własnych zdarzeń kontroli w celu zapoznania się z Height gdy właściwe. W ten sposób nie musisz niczego zmieniać w kodzie Form.

Tak więc, w tym przypadku, kod może wyglądać następująco (nie testowałem to chociaż):

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

ten sposób kontrola może sam siebie regulować za każdym razem jego rozmiar jest zmieniany.

Powiązane problemy