どStackPanelの子どもたちを記入し最大限のスペースを下方?
-
05-09-2019 - |
質問
私たちの示す意思によって、今日の流れるテキストのヘルプボックス右の通りです。
のヘルプボックスを拡大すべきであるので用いられる。
た場合の外StackPanel下で動作します。
ものを理由にレイアウトによって挿入UserControls動的に)しているものがあり包装StackPanel.
どうやっていけばいいですか?るGroupBoxの延段のStackPanelきました:
- VerticalAlignment="Stretch"
- VerticalContentAlignment="Stretch"
- Height="オート"
ー:
<Window x:Class="TestDynamic033.Test3"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Test3" Height="300" Width="600">
<StackPanel
VerticalAlignment="Stretch"
Height="Auto">
<DockPanel
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Height="Auto"
Margin="10">
<GroupBox
DockPanel.Dock="Right"
Header="Help"
Width="100"
Background="Beige"
VerticalAlignment="Stretch"
VerticalContentAlignment="Stretch"
Height="Auto">
<TextBlock Text="This is the help that is available on the news screen." TextWrapping="Wrap" />
</GroupBox>
<StackPanel DockPanel.Dock="Left" Margin="10" Width="Auto" HorizontalAlignment="Stretch">
<TextBlock Text="Here is the news that should wrap around." TextWrapping="Wrap"/>
</StackPanel>
</DockPanel>
</StackPanel>
</Window>
回答:
コマーク使用DockPanelの代わりにStackPanelクリアされます。一般的に、私が使用DockPanelり今コンポーネントのラインナップlayouting、"わらびもち"をここで、固定ー:
<Window x:Class="TestDynamic033.Test3"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Test3" Height="300" Width="600" MinWidth="500" MinHeight="200">
<DockPanel
VerticalAlignment="Stretch"
Height="Auto">
<DockPanel
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Height="Auto"
MinWidth="400"
Margin="10">
<GroupBox
DockPanel.Dock="Right"
Header="Help"
Width="100"
VerticalAlignment="Stretch"
VerticalContentAlignment="Stretch"
Height="Auto">
<Border CornerRadius="3" Background="Beige">
<TextBlock Text="This is the help that is available on the news screen." TextWrapping="Wrap"
Padding="5"/>
</Border>
</GroupBox>
<StackPanel DockPanel.Dock="Left" Margin="10" Width="Auto" HorizontalAlignment="Stretch">
<TextBlock Text="Here is the news that should wrap around." TextWrapping="Wrap"/>
</StackPanel>
</DockPanel>
</DockPanel>
</Window>
解決
これは、最後の要素は、すべての残りのスペースを使用してどこがStackPanel
をしたいように聞こえます。しかし、なぜDockPanel
を使用していませんか? DockPanel
でDockPanel.Dock="Top"
内の他の要素を飾る、その後、あなたの助けの制御は、残りのスペースを埋めることができます。
XAMLます:
<DockPanel Width="200" Height="200" Background="PowderBlue">
<TextBlock DockPanel.Dock="Top">Something</TextBlock>
<TextBlock DockPanel.Dock="Top">Something else</TextBlock>
<DockPanel
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Height="Auto"
Margin="10">
<GroupBox
DockPanel.Dock="Right"
Header="Help"
Width="100"
Background="Beige"
VerticalAlignment="Stretch"
VerticalContentAlignment="Stretch"
Height="Auto">
<TextBlock Text="This is the help that is available on the news screen."
TextWrapping="Wrap" />
</GroupBox>
<StackPanel DockPanel.Dock="Left" Margin="10"
Width="Auto" HorizontalAlignment="Stretch">
<TextBlock Text="Here is the news that should wrap around."
TextWrapping="Wrap"/>
</StackPanel>
</DockPanel>
</DockPanel>
あなたが(例えばWindowsStore)利用可能DockPanel
なしのプラットフォーム上にある場合は、、あなたはグリッドと同じ効果を作成することができます。代わりに、グリッドを使用して達成ここで、上記の例だ:
<Grid Width="200" Height="200" Background="PowderBlue">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0">
<TextBlock>Something</TextBlock>
<TextBlock>Something else</TextBlock>
</StackPanel>
<Grid Height="Auto" Grid.Row="1" Margin="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="100"/>
</Grid.ColumnDefinitions>
<GroupBox
Width="100"
Height="Auto"
Grid.Column="1"
Background="Beige"
Header="Help">
<TextBlock Text="This is the help that is available on the news screen."
TextWrapping="Wrap"/>
</GroupBox>
<StackPanel Width="Auto" Margin="10" DockPanel.Dock="Left">
<TextBlock Text="Here is the news that should wrap around."
TextWrapping="Wrap"/>
</StackPanel>
</Grid>
</Grid>
他のヒント
これが起こっていることの理由は、それが一緒に要素を積み重ねている軸の制約として正の無限大とのスタックパネルの措置ので、すべての子要素です。コントロールは、彼らが(正の無限大になりたいどのように大きな返却する必要があり、子供は<のhref = "http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.measureoverrideから有効な戻りではありません.aspxの」REL = 『noreferrer』>軸のいずれかでMeasureOverride の)ので、彼らはすべてが収まる最小サイズを返します。彼らは、彼らが実際に入力する必要がどのくらいのスペース知る方法はありません。
あなたのビューがスクロール機能と上記の答えを持っている必要はありません、あなたのニーズに合わない場合は、、私は自分自身のパネルを実装することをお勧め。あなたは、おそらくのStackPanelから直接派生させることができ、その後、あなたが行う必要がありますすべては<のhref =「http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.arrangeoverride.aspx」のrelを変更で=「noreferrer」> ArrangeOverride の方法、それはその子要素(それらそれぞれに余分なスペースの同じ量を与える)との間の残りのスペースを分けるようにします。彼らは、彼らが望んでいたよりも多くのスペースを与えられている場合の要素が細かいレンダリングする必要がありますが、あなたはあまりそれらを与える場合は、グリッチを見て開始します。
あなたはScrollViewerのは、あなたと同じ位置にあなたを置くであろうと仕事をするスペースの無限の量を与えるので、私は恐れて物事はかなりより困難になりますよ、その後全体をスクロールできるようにしたい場合子要素が最初にありました。あなたはビューポートのサイズを指定することができますあなたの新しいパネルに新しいプロパティを作成したい場合があります。このような状況では、ScrollViewerののサイズにこれをバインドすることができるはずです。理想的には、 IScrollInfo に実装するだろうが、それはあなたが適切にそれのすべてを実装しようとしている場合は、複雑な取得するために開始します。
別の方法は、1つの列と N の行を有するグリッドを使用することです。全てAuto
する行の高さ、及び1*
に一番下の行の高さを設定します。
私はこの方法を好みます。あなたは(レイアウトは、多数の項目について行われている)ItemTemplateに、それらを使用している場合を除きしかし、あなたはおそらく気づくことは決してないだろう。
あなたはのStackPanelの修正版を使用することができます:
<st:StackPanel Orientation="Horizontal" MarginBetweenChildren="10" Margin="10">
<Button Content="Info" HorizontalAlignment="Left" st:StackPanel.Fill="Fill"/>
<Button Content="Cancel"/>
<Button Content="Save"/>
</st:StackPanel>
最初のボタンは塗りつぶしになります。
あなたはNuget経由でインストールすることができます:
Install-Package SpicyTaco.AutoGrid
私はまた、 WPF-autogrid のを見てみましょうお勧めします。これは、WPFの代わりに、DockPanel、StackPanelのグリッドでのフォームのために非常に有用だと非常に簡単かつ優雅にストレッチして問題を解決します。ただ、githubの上のreadmeを見ます。
<st:AutoGrid Columns="160,*" ChildMargin="3">
<Label Content="Name:"/>
<TextBox/>
<Label Content="E-Mail:"/>
<TextBox/>
<Label Content="Comment:"/>
<TextBox/>
</st:AutoGrid>
カップルのものをなにができる:
1:の設定 Orientation
へ 垂直:
<StackPanel Orientation="Vertical"></StackPanel>
の設定
Height
のStackPanel
同一のウィンドウ
もちろん、を組み合わせることができれ 特性:
<StackPanel Orientation="Vertical" Height="600"></StackPanel>
すなビバップからハードバップの作品を設置NuGetsとwhatnot....
編集
できるものStackPanel内のScrollViewer.ることができま制御の高さのGroupBoxを犠牲にせずにコンテンツ件です。
<GroupBox>
<ScrollViewer>
<StackPanel Orientation="Vertical>
<!-- Place Children Objects here-->
<StackPanel>
<ScrollViewer>
<GroupBox>