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;
}
Hat die von mir vorgeschlagene Lösung für Sie funktioniert? –
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? –
Machen Sie einfach ** Update ** in Ihrer Frage Überschrift und aktualisieren Sie es mit der Antwort, die Sie haben und eine Beschreibung :). –