Stackpanel의 너비를 가장 작은 어린이 요소로 제한하십시오
-
22-08-2019 - |
문제
수직 WPF를 어떻게 제한 할 수 있습니까? StackPanel
가장 좁은 품목에 대한 너비는 포함되어 있습니다. 그만큼 StackPanel
의 폭은 다른 어린이 요소의 너비보다 크지 않아야합니다.
해결책
불행히도 ivalueconverter 접근 방식은 항상 작동하지는 않습니다. 아이들이 추가 된 경우 스택 패널 예를 들어, 정적으로, 아동 컬렉션은 바인딩 시점에 비어 있습니다 (그래서 발견). 가장 간단한 솔루션은 사용자 정의 패널을 만드는 것입니다.
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>
다음과 같은 것을 렌더링합니다.
이게 도움이 되길 바란다.
다른 팁
값을 상쇄하기 위해 컨버터를 생성조차조차도 실제 전체 속성에 바인딩을 시도했으며, 이는 한 가지 예외로 훌륭하게 작동합니다. 컨테이너의 크기를 확장하면 너비가 올바르게 업데이트되지만 컨테이너를 더 작게 만들 때 실제 콘텐츠의 너비는 작아 지지만 모든 스크롤 뷰어의 "페이지 너비"는 그렇지 않습니다. 나는 이것을 해결하는 방법이 있다고 확신하지만, 나는 그것을 찾지 못했습니다.
당신은 할 수 없습니다. 수직 지향 StackPanel
어린이가 요청하는만큼 항상 많은 폭을 할당합니다.
원하는 행동을 달성하기 위해 사용자 정의 패널을 작성하는 것이 가장 좋습니다.
제휴하지 않습니다 StackOverflow