94

私は、パネルを作成し、その中にコントロールを配置DockStyle.Fillし、それらのサイズを周囲のパネルに合わせて最大化することを Windows フォームから使用しています。

WPFでは、私は同じことをしたいです。私は TabControl を持っており、そのサイズをできるだけ多くのフォームに合わせたいと思っています。リボン コントロール (RibbonControlsLibrary) があり、フォームの残りの部分を TabControl で最大サイズで埋めたいと考えています。

(Visual Studio でのドッキングのようにコントロールをドッキングしたくありません。古いドッキング メカニズムだけです)

4

4 に答える 4

185

WinForms の DockStyle.Fill に相当する WPF は次のとおりです。

HorizontalAlignment="Stretch" VerticalAlignment="Stretch"

これはほとんどのコントロールのデフォルトであるため、一般に、WPF コントロールで親コンテナーを埋めるために何もする必要はありません。それらは自動的に行います。これは、子を最小サイズに圧縮しないすべてのコンテナーに当てはまります。

よくある間違い

ここで、期待どおりに動作しないいくつかのよくある間違いについて説明しHorizontalAlignment="Stretch" VerticalAlignment="Stretch"ます。

1. 明示的な高さまたは幅

よくある間違いの 1 つは、コントロールの幅または高さを明示的に指定することです。したがって、これがある場合:

<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. パネルを含むと、コントロールが最小サイズに縮小されます

もう 1 つのよくある間違いは、含まれているパネルがコントロールをできるだけきつく絞ることです。たとえば、垂直の StackPanel は、常にコンテンツを可能な限り垂直方向に縮小します。

<StackPanel>
  <Button Content="Why am I squished flat?" />
</StackPanel>

別のパネルに変更すると、準備完了です。

<DockPanel>
  <Button Content="I am no longer squished." />
</DockPanel>

また、高さが "Auto" の Grid の行または列は、同様にその方向に内容を絞り込みます。

子をスクイーズしないコンテナーの例を次に示します。

  • ContentControls は子をスクイーズしません (これには、Border、Button、CheckBox、ScrollViewer、その他多数が含まれます)。
  • 行と列が 1 つのグリッド
  • 「*」サイズの行と列のグリッド
  • DockPanel が最後の子をスクイーズしない
  • TabControl はコンテンツを圧縮しません

子を圧迫するコンテナの例を次に示します。

  • StackPanel は Orientation 方向にスクイーズします
  • 「自動」サイズの行または列を持つグリッドは、その方向にスクイーズします
  • DockPanel は、最後の子を除くすべての子をドック方向にスクイーズします
  • TabControl はヘッダーを縮小します (タブに表示されるもの)

3. 明示的な高さまたは幅

次のように、明示的な高さと幅が指定された Grid または DockPanel を何度も目にするのは驚くべきことです。

<Grid Width="200" Height="100">
  <Button Content="I am unnecessarily constrainted by my containing panel" />
</Grid>

一般に、パネルに明示的な高さまたは幅を与えることは決してありません。レイアウトの問題を診断するときの最初のステップは、見つかった明示的な高さまたは幅をすべて削除することです。

4. Window が SizeToContent であってはならない場合

SizeToContent を使用すると、コンテンツは最小サイズに縮小されます。多くのアプリケーションで、これは非常に便利で正しい選択です。ただし、コンテンツに「自然な」サイズがない場合は、SizeToContent を省略した方がよいでしょう。

于 2010-07-11T17:47:12.783 に答える
7

あなたはただ言うだけであなたがやりたいことをすることができますDockPanel LastChildFill="True"そしてそれからあなたがフィラーになりたいものが実際に最後の子供であることを確認してください!

グリッドは、ほとんどすべてのことを実行できるレイアウトの獣ですが、DockPanelは通常、最も外側のレイアウトパネルに適しています。擬似コードの例を次に示します。

<DockPanel LastChildFill="True">
    <MyMenuBar DockPanel.Dock="Top"/>
    <MyStatus DockPanel.Dock="Bottom"/>

    <MyFillingTabControl />
</DockPanel>
于 2010-07-09T20:04:01.150 に答える
5

コントロールを 2 行のグリッドにラップするだけです。グリッドは、与えられたすべてのスペースを自動的に使用します。高さ "*" を指定することで、残ったすべてのスペースを使用するように行を定義できます。この例の最初の行 (Height="Auto") は、リボンが必要とするだけのスペースを占有します。それが役立つことを願っています。

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="*" />
  </Grid.RowDefinitions>

  <Ribbon Grid.Row="0" />

  <TabPage Grid.Row="1" />
</Grid>

「Grid.Row=..」属性をグリッドの子コントロールに追加することで、グリッドの行に割り当てられます。次に、行定義で定義されているように、グリッドはその子のサイズを調整します。

于 2010-07-09T19:51:11.253 に答える
0

ここで多くの方法を試しましたが、問題を解決できません。(コントロール内の他のコントロールを埋める)

見つけるまで

<Name_Control Height="auto" Width="auto"/>
//default
//HorizontalAlignment="Stretch" 
//VerticalAlignment="Stretch"

例:

//UserControl:
<UserControl Name="UC_Test" Height="auto" Width="auto" />
//Grid: 
<Grid Name="Grid_test" Grid.ColumnSpan="2" Grid.Row="2" />
//Code: 
Grid_test.Children.Add(UC_Test);

簡単な設計のために

<UserControl Name="UC_Test" Height="100" Width="100" />
//Code
Grid_test.Children.Add(UC_Test);
UC_Test.Width = Double.NaN;
UC_Test.Height = Double.NaN;
于 2016-11-24T19:24:01.300 に答える