2012-04-25 10 views
6

VS2008で有効なのボタンを持つ簡単なユーザーコントロール(WPFではなく)を作成しようとしています。プロパティを切り替えてコントロールをサイズ変更するPanel1Panel1。問題は、ランタイムでthis.Heightではなく、設計時に設定されているものよりも、コントロールがユーザーコントロールデザイナーである値であることであるユーザーコントロールの実行時の幅と高さ

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

:ここ

は、コントロールの裸の骨ですメインフォームのデザイナー。

ご協力いただければ幸いです。ルーカスのソリューションに続き

UPDATE

、この方法は_openHeightのみ所望の効果が得られ、一度設定されていることを意味します

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

私が提案したソリューションはあなたのために働いていますか? –

+1

ちょうどあなたの2番目の解決策をテストし、少し修正するだけで動作します。修正されたソリューションで回答を更新するのが適切な方法ですか? –

+0

あなたの質問の見出しにna ** Update **を作成し、あなたの答えといくつかの説明で更新してください:)。 –

答えて

5

あなたには、コントロールのHeightプロパティを読んでいますそれはコンストラクタです。つまり、おそらくフォームに表示される前のことです。事は、コントロールがフォームに表示される必要があるときにサイズが調整されているようです。これまでは、コントロールのデザイナで設定されている値ですが、これは現在取得しています。

問題を解決する最も簡単な方法は、あなたがコントロールのコンストラクタのうち、openパラメータを取得することができ、すなわち、コントロールがすでに形で描かれたことを確認していたときに、Height値を読み取るOpenを初期化する新しい方法を追加することです_closedHeightとそれをLoadという形式のイベントと呼びます。このような

何か:

public MyUserControl() 
{ 
    InitializeComponent(); 
} 

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

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

次にフォームのLoadイベントからAdjustControlSizeメソッドを呼び出します。あなたはまた、適切な場合Heightを読み取るために、コントロールの独自のイベントを使用することができますイベンティングメカニズム

ソリューション。この方法では、Formのコードで何も変更する必要はありません。

ので、この場合には、コードは(私はこのかかわらをテストしていません)次のようになります。

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

この方法でコントロールは、自己自体のサイズが変更されるたびに調整することができます。

関連する問題