2012-04-25 21 views
6

Ich versuche, eine einfache Benutzersteuerung (nicht WPF) in VS2008 zu schaffen, die effektiv eine SplitContainer mit einem Knopf in Panel1 ist, die, wenn sie gedrückt wird, schaltet die Panel2Collapsed Eigenschaft und ändert die Größe der Steuerung auf die Größe Panel1.Usercontrol Runtime Breite und Höhe

Hier sind die blanken Knochen der Steuerung:

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

Das Problem ist, dass this.Height in Runtime der Wert ist, der die Steuerung im Designer User Control ist, als das, was auf dem Design-Zeit eingestellt ist in der Designer des Hauptformulars.

Jede Hilfe würde sehr geschätzt werden.

UPDATE

von Lucas' Lösung Im Anschluss an, bedeutet dies, Art und Weise, dass die _openHeight nur einmal festgelegt ist, in der gewünschten Wirkung führt:

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

Hat die von mir vorgeschlagene Lösung für Sie funktioniert? –

+1

Habe gerade deine zweite Lösung getestet und mit ein bisschen Modifikation funktioniert es. Ist es richtig, Ihre Antwort mit meiner modifizierten Lösung zu aktualisieren? –

+0

Machen Sie einfach ** Update ** in Ihrer Frage Überschrift und aktualisieren Sie es mit der Antwort, die Sie haben und eine Beschreibung :). –

Antwort

5

Du liest gerade die Height-Eigenschaft der Kontrolle in Es ist Konstruktor, was bedeutet, es ist wahrscheinlich, bevor es in der Form zeigt. Die Sache ist, die Größe scheint angepasst zu werden, wenn das Steuerelement im Formular angezeigt werden muss. Davor ist es ein Wert, der im Designer des Steuerelements festgelegt ist, den Sie jetzt erhalten.

Der einfachste Weg, um das Problem zu lösen, ist den Height Wert zu lesen, wenn Sie sicher sind, dass die Steuerung bereits in Form gezogen wurde, dh Sie open Parameter aus der Konstruktor der Kontrolle zu bekommen, eine neue Methode, die Open hinzufügen initialisiert und _closedHeight und rufen Sie es in Load Ereignis des Formulars.

Etwas wie folgt aus:

public MyUserControl() 
{ 
    InitializeComponent(); 
} 

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

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

Dann rufen Sie AdjustControlSize Methode von Load Ereignis des Formulars.

Lösung mit Vielseitigkeits Mechanismus

Sie auch die Kontrolle der eigenen Veranstaltungen nutzen können die Height bei Bedarf zu lesen. Auf diese Weise müssen Sie im Code Form nichts ändern.

Also, in diesem Fall kann der Code wie folgt aussehen (ich habe dies aber nicht getestet):

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

Auf diese Weise kann die Steuerung selbst sich jedes Mal seine Größe geändert wird, einzustellen.