StackPanel
垂直方向の WPFの幅を、それに含まれる最も狭い項目に制限するにはどうすればよいですか。のStackPanel
幅は、他の子要素の幅よりも大きくしてはなりません。
2324 次
3 に答える
2
残念ながら、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>
これは次のようなものをレンダリングします:
これがお役に立てば幸いです。
于 2008-12-18T16:18:02.303 に答える
1
できません。垂直方向StackPanel
は常に、その子が要求する幅を割り当てます。
目的の動作を実現するには、カスタム パネルを作成することをお勧めします。
于 2008-12-18T13:04:11.553 に答える
1
ActualWidth プロパティにバインドしようとしましたが、値をオフセットするコンバーターを作成しても、これは 1 つの例外を除いてうまく機能します。コンテナーのサイズを拡大すると、幅は適切に更新されますが、コンテナーを小さくするときは、実際のコンテンツの幅は小さくなりますが、スクロールビューアの「ページ幅」は小さくなりません。これを回避する方法があると確信していますが、見つけられませんでした。
于 2009-02-02T19:33:05.627 に答える