1

UIにデータを表示するために再利用されるコントロールのコレクションを含むユーザーコントロールがあります。フォーム上の別のコンテナ(たとえば、パネル)からコントロールの親を変更し、新しいタブページを作成してから、コントロールをタブページに追加する「ポップアウト」オプションを実装しようとしました。

残念ながら、コントロールがTabPageに追加されると、そのサイズは最後の親で提示された方法にロックされているように見えます。

ParentChangedイベントをオーバーライドして、コントロールが実際にTabPageに追加されたことを検出しました。サイズを調べる場合は、サイズをTabPageのClientRectangleに設定してから、サイズを再調べしてください。サイズは変更されません。Dockプロパティを設定しても、この動作(特に塗りつぶし)は変更されません。

protected override void OnParentChanged(EventArgs e)
{
    if (this.Parent != null)
    {
        Size oldSize = this.Size;

        this.Size = this.Parent.ClientRectangle.Size;

        if (this.Size == oldSize)
        {
            // this is where we end up
            throw new Exception("We didn't change size!");
        }
    }
}
4

2 に答える 2

0

コントロールをDockに設定している場合は、サイズ/位置を変更しようとしても無視される可能性があります。個人的には、Dock / Anchor / AutoSizeの動作をオフにして、コントロールの位置とサイズを手動で設定するだけです。私はこの種のことをたくさんやったことがあり、問題はなかったので、あなたは自動レイアウトオプションと戦っているだけで、それが勝っていると思います。

Dockに作業を任せたい場合は、タブを蹴ってレイアウトの再計算を開始する必要がありますか?(これを実行できる可能性のあるControl.LayoutEngineオブジェクトがありますが、ここでは調査の可能性のある手段を仮定しています-私はそれを自分で試していません)

とにかく、それがあなたにいくつかのアイデアを与えるかもしれないことを願っています...

于 2010-03-10T18:59:24.850 に答える
0

コントロールは最初にコンテナコントロールに追加されました。リフレクターを介してコンテナーコードの内部に飛び込むと、親が変更されていたコントロールの最小/最大サイズ値が設定されていました。不正確に、デフォルトの最小/最大設定が設計者からのデフォルトとして残されていると思いました。残念ながら、コンテナ制御は別の方法で決定されました。行く、行く、リフレクター!もちろん、この動作は文書化されていません。

よろしくお願いします。

于 2010-03-10T19:11:42.963 に答える