最小の子要素へのStackPanelの幅を制限
-
22-08-2019 - |
質問
どのように私はそれが含まれている最も狭い項目に垂直WPFのStackPanel
の幅を制限することができます。 StackPanel
の幅が他の子要素の幅より大きくすることはできません。
解決
残念ながら、のIValueConverter のアプローチは、常に動作しません。子どもたちは、のStackPanelののに追加されている場合は、静的に、例えば、子コレクションは、(私が発見した)結合時に空になります。最も簡単な解決策は、カスタムパネルを作成することです。
public class ConstrainedStackPanel : StackPanel
{
public ConstrainedStackPanel()
{
}
protected override Size MeasureOverride(Size constraint)
{
foreach (var item in this.Children)
{
// FrameworkElement has the Width property we care about.
FrameworkElement element = item as FrameworkElement;
if (element != null)
constraint.Width = Math.Min(element.Width, constraint.Width);
}
return base.MeasureOverride(constraint);
}
protected override Size ArrangeOverride(Size arrangeSize)
{
foreach (var item in this.Children)
{
// FrameworkElement has the Width property we care about.
FrameworkElement element = item as FrameworkElement;
if (element != null)
arrangeSize.Width = Math.Min(element.Width, arrangeSize.Width);
}
return base.ArrangeOverride(arrangeSize);
}
}
以下のXAMLによって示されるように、あなたはパネルを使用することができます:
<StackPanel Margin="5">
<TextBlock Text="StackPanel:" FontWeight="Bold" />
<StackPanel x:Name="panelA">
<Button Width="100" Content="100" />
<Button Width="200" Content="200" />
<Button Width="300" Content="300" />
<Button Width="400" Content="400" />
</StackPanel>
<TextBlock Text="ConstrainedStackPanel:" FontWeight="Bold" Margin="0,10,0,0" />
<l:ConstrainedStackPanel x:Name="panelB">
<Button Width="100" Content="100" />
<Button Width="200" Content="200" />
<Button Width="300" Content="300" />
<Button Width="400" Content="400" />
</l:ConstrainedStackPanel>
</StackPanel>
次のようなものをレンダリングするどのます:
私はこのことができます願っています。
他のヒント
私も値を相殺するために、コンバータを作成し、これは1つの例外を除いて素晴らしい作品、ActualWidthプロパティにバインドしようとしている:あなたは、コンテナのサイズを拡大するよう、幅が適切に更新されますが、時にコンテナを作るために小さく、実際のコンテンツの幅が小さくなるが、任意のscrollviewersの「ページ幅」ではないでしょう。私はこの問題を回避する方法があります確信しているが、私はそれを見つけていない。
あなたがすることはできません。垂直に配向さStackPanel
は常にその子の要求と同じくらいの幅を割り当てます。
あなたは、あなたの希望の動作を実現するためにカスタムパネルを書いオフ最善だろう。
所属していません StackOverflow