[解決済み] WPFの標準コントロールにDockStyle.Fillを使用するには?
質問
私はWindowsフォームから、パネルを作成し、その中にコントロールを配置し、それらに
DockStyle.Fill
を使用して、周囲のパネルに対してそのサイズを最大化します。
WPFでも同じようにしたいです。TabControl があり、そのサイズがフォームのできるだけ多くを埋めるようにしたいです。 リボン コントロール (RibbonControlsLibrary) があり、フォームの残りを最大サイズの TabControl で満たしたいのです。
(Visual Studio のドッキングのようにコントロールをドッキングするのではなく、単に古いドッキング機構を使用したいのです)
どのように解決するのですか?
WinFormsのDockStyle.Fillに相当するWPFは。
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
これはほとんどのコントロールのデフォルトなので 一般に、WPFコントロールがその親コンテナを満たすために、何もする必要はありません。 : それらは自動的にそうします。 これは、子コンテナを最小サイズに絞らないすべてのコンテナについて当てはまります。
よくある間違い
では、このような「よくある間違い」をいくつか説明します。
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
が期待通りに動作するのを妨げる、いくつかのよくある間違いを説明します。
1. 明示的な高さまたは幅
よくある間違いは、コントロールのWidthやHeightを明示的に指定することです。 ですから、もしあなたがこのような
<Grid>
<Button Content="Why am I not filling the window?" Width="200" Height="20" />
...
</Grid>
WidthとHeightの属性を削除するだけです。
<Grid>
<Button Content="Ahhh... problem solved" />
...
</Grid>
2. 制御を最小限の大きさに抑えたパネル
もう一つのよくある間違いは、コントロールが入るのと同じくらい狭くなるように、含むパネルが圧迫することです。 たとえば、垂直の StackPanel は、常にそのコンテンツを垂直方向にできるだけ小さく圧縮します。
<StackPanel>
<Button Content="Why am I squished flat?" />
</StackPanel>
他のPanelに変更すれば、問題ありません。
<DockPanel>
<Button Content="I am no longer squished." />
</DockPanel>
また、高さが "Auto" である任意の Grid 行または列は、同様にその方向にコンテンツを圧迫します。
子要素を圧迫しないコンテナの例をいくつか挙げます。
- ContentControls は決してその子を圧迫しません (これには Border、Button、CheckBox、ScrollViewer、および他の多くが含まれます)。
- 単一の行と列を持つグリッド
- 行と列のサイズが "*"であるグリッド
- DockPanel が最後の子を圧迫しないようにする。
- TabControl がコンテンツを圧縮しない
子コンテンツを圧迫するコンテナの例をいくつか挙げます。
- StackPanel はそのオリエンテーションの方向にスクイーズします。
- Auto"サイズの行または列を持つグリッドは、その方向にスクイーズされます。
- DockPanel は、その最後の子以外のすべてをその Dock 方向に縮小します。
- TabControl はヘッダ(タブに表示されるもの)をスクイーズします。
3. 高さまたは幅をさらに明示する
このようにGridやDockPanelに明示的な高さや幅が与えられているのを何度も見かけるのは驚きです。
<Grid Width="200" Height="100">
<Button Content="I am unnecessarily constrainted by my containing panel" />
</Grid>
一般に、どのパネルにも明示的な高さや幅を与えたくありません。 レイアウトの問題を診断するときの私の最初のステップは、見つけることができるすべての明示的な高さまたは幅を削除することです。
4. ウィンドウが、そうでないはずなのに SizeToContent になっている。
SizeToContentを使用すると、コンテンツは最小限のサイズに縮小されます。 多くのアプリケーションでは、これは非常に便利であり、正しい選択です。 しかし、コンテンツが自然なサイズでない場合は、SizeToContentを省略することをお勧めします。
関連
-
[解決済み】C#で四捨五入する方法
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み] 辞書を繰り返し使用するには?
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] 乱数(int)を生成する方法を教えてください。
-
[解決済み] IDisposable インターフェースの正しい使用法
-
[解決済み] RelativeSourceでWPFバインディングを使用するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み] 2つのリストを結合する
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み】パラメータ付きRedirectToAction