2012-02-27 31 views
1

GDI +を使用してテキストとグラフィックスを描画するカスタムUserControlがあります。通常、別のコントロール内でDockStyle.Bottomを使用してドッキングします。カスタムUserControlでAutoSizeを実装する

このコントロールのサイズは、Graphics.MeasureString()を使用するカスタムレイアウトによって決まります。したがって、幅が変更されるたびに高さを再計算する必要があります。これは、親の幅が変更されたときに変更されます。

現在、このコントロールの高さをOnSizeChangedイベントに設定しています。しかし、私はこれにいくつかのバグに気付いています。ときどき親のサイズを変更すると、DockStyle.Bottomに設定されていても、コントロールは親の下部に触れていません。私はSpy ++を使ってコントロールの境界を分析し、コントロールと親のエッジの間には約20ピクセルだけ空のスペースがあります。

トップまたはボトムDockStyleを前提としたこのUserControlで適切なAutoSizeを実装したいと思います。

+0

FlowLayoutPanelとUserControl自体の両方でAutoSizeをtrueに設定しようとしましたか? –

+0

FlowLayoutPanelを使用していません。 –

+0

これにFlowLayoutPanelを使用すると何か問題がありますか?アンカーの設定はどうですか?ユーザーコントロールのすべてのコントロールにアンカーとドッキングを使用し、コントロールの端をドッキングするように設定すると、コントロールはUserControlでサイズが変更され、アンカー/ドッキングもUserControlに設定できるようになります。 UserControlのAnchorプロパティとDockプロパティを組み合わせて、コントロールの端がUIの他の部分に表示されるようにオプションを設定します。 UIのサイズが変更されると、コントロールのサイズも適切に変更されます。 –

答えて

1

WindowsFormsのDefaultLayoutエンジンには、ドッキングされたコントロールをレイアウトするためのかなりのロジックがあります。逆コンパイラ(dotPeek、Reflectorなど)を推奨し、DefaultLayoutクラスを逆コンパイルします。あなたのgetPreferredSizeが呼び出され、その下文脈を理解するとき

それはのgetPreferredSizeなどなど

をオーバーライドするかどうかをコントロール自体、その子との間の多くの相互作用がありますおそらく、あなたは、より良いアイデアを得るでしょうそれを実装する方法。

サンプルの実装に関しては、Windowsよりも何が優れていますか?少数のものを逆コンパイルする。ここにToolStripItemの例があります

public virtual Size GetPreferredSize(Size constrainingSize) 
    { 
     constrainingSize = LayoutUtils.ConvertZeroToUnbounded(constrainingSize); 
     return this.InternalLayout.GetPreferredSize(constrainingSize - this.Padding.Size) + this.Padding.Size; 
    } 

幸いです!

関連する問題