사용 가능한 공간을 채우기 위해 WPF에서 컨트롤을 얻는 방법은 무엇입니까?


303

와 같은 일부 WPF 컨트롤 Button은 높이를 지정하지 않으면 컨테이너의 사용 가능한 모든 공간을 행복하게 사용하는 것으로 보입니다.

그리고 일부는 지금 당장 사용해야하는 것과 같이 (멀티 라인) TextBoxListBox내용에 맞는 공간을 취하는 것에 대해 더 걱정 하는 것처럼 보입니다.

이 사람들을의 셀에 넣으면 UniformGrid사용 가능한 공간에 맞게 확장됩니다. 그러나 UniformGrid모든 상황에 적합한 인스턴스는 아닙니다. 자체와 다른 행 사이의 높이를 나누기 위해 일부 행이 * 높이로 설정된 그리드가있는 경우 어떻게합니까? a가 StackPanel있고 a Label, a List및 a가있는 Button경우 어떻게 레이블과 버튼으로 먹지 않은 모든 공간을 차지하도록 목록을 만들 수 있습니까?

이것이 실제로 기본 레이아웃 요구 사항이라고 생각할 수는 있지만 가능한 공간을 채우는 방법을 알 수는 없습니다 (a에 넣고 DockPanel채우도록 설정하는 것도 효과가 없습니다. 은 DockPanel에만 '서브 컨트롤에 필요한 공간)을 차지합니다.

당신이 연주했다 경우 크기 조정이 가능한 GUI는 매우 끔찍한 것 Height, Width, MinHeight, MinWidth

점유하고있는 그리드 셀에 속성 HeightWidth속성을 바인딩 할 수 있습니까 ? 아니면 다른 방법이 있습니까?


1
UniformGrid는 놀랍습니다. 새로운 기본 goto 태그입니다. 나는 Stackpanels의 단순함을 좋아했지만 (div를 생각 나게 함) Uniform Grid는 내가 필요한 것을 정확하게 수행합니다.
Terrance

UniformGrid를 다시. 강조는 유니폼입니다. 열 너비를 행 높이없이 조정할 수없는 것 같습니다. 각 컨텐츠가 동일한 크기 인 경우에만 적합합니다. StackPanel을 Grid로 바꾸고 Stretch는 예상대로 작동했습니다.
pdschuller

이 기사 는 텍스트 상자를 늘리는 데 도움 되었습니다.
jpaugh

답변:


162

에서 파생 된 각 컨트롤 Panel은 다음 Measure()Arrange()같이 수행되는 고유 한 레이아웃 논리 를 구현합니다 .

  • Measure() 패널과 각 자식의 크기를 결정합니다.
  • Arrange() 각 컨트롤이 렌더링되는 사각형을 결정합니다.

DockPanel채우기 의 마지막 자식은 나머지 공간을 채 웁니다. LastChild속성을 로 설정하여이 동작을 비활성화 할 수 있습니다 false.

StackPanel자사의 원하는 크기에 대한 각각의 자녀를 요구 한 다음 스택. 스택 패널 Measure()은 사용 가능한 크기의 각 자식을 호출 Infinity한 다음 원하는 크기를 사용합니다.

A Grid는 사용 가능한 모든 공간을 차지하지만 각 자식을 원하는 크기로 설정 한 다음 셀 중앙에 배치합니다.

당신은에서 파생하여 자신의 레이아웃 논리를 구현 Panel하고 무시 MeasureOverride()하고 ArrangeOverride().

간단한 예는 이 기사 를 참조하십시오 .


8
링크는 이제 죽었
user3690202

6
@ user3690202 Archive.org는 당신의 친구입니다. 링크가 다시 애니메이션되었습니다.
ruffin

4
이 주제는 여전히 MSDN에 있지만 링크는 다음과 같이 변경되었습니다. docs.microsoft.com/en-us/dotnet/framework/wpf/controls/…
Andrea Antonangeli 2016 년

2
The last child of the DockPanel fills the remaining space: 이것은 내 이해의 열쇠가 아닙니다. 나는 항상 명시 적 Dock이없는 요소가 공간을 채 웠습니다.
발견

238

컨트롤이 그렇지 않은 경우 사용 가능한 공간을 채우도록 컨트롤을 설정할 수있는 속성도 있습니다. 예를 들어 다음과 같이 말할 수 있습니다.

HorizontalContentAlignment="Stretch"

... 컨트롤 내용을 가로로 늘입니다. 또는 당신은 말할 수 있습니다 :

HorizontalAlignment="Stretch"

... 컨트롤 자체를 수평으로 늘려 부모를 채 웁니다.


88
이 모든 사례에서 언급 된 가장 악명 높은 패널은 StackPanel입니다. ContentAlignment 속성이 포함되어 있지 않으며 자식을 Stretch로 설정해도 별표 크기의 격자 내부에는 아무런 영향이 없습니다. 매우 실망 스럽습니다. 마치 StackPanel이 WPF 팀이 작성한 첫 번째 컨테이너 인 것처럼 보이며 그 경우가 그렇습니다.
Brent Schooley

4
@ 브렌트-아! 스택 패널의 내용을 올바르게 채우려 고 노력했습니다. 감사! 나는 그것이 내가 잘못하고있는 것이라고 생각했습니다.
Ashley Grenon

8
@townsean Stack 패널은 매우 제한적입니다. UniformGrid를 사용하여 스트레칭하고 행 또는 열을 0으로 설정하면 비슷한 동작을 얻을 수 있습니다.
ForbesLindesay

2
@ Tuskan360 UniformGrid는 셀의 크기 만 동일하게합니다. 나는 결국 그리드를 사용했는데 작동하는 것 같습니다. StackPanel이 설계된 것처럼 보이지 않는 방식을 짜증나게합니다.
TarkaDaal

4
@TarkaDaal yeh, UniformGrid 모든 크기가 같은 경우 복잡한 그리드, 복잡한 상대 크기를 지정하려면 그리드를 내용에 따라 크기를 지정하고 사용 가능한 공간을 무시하십시오.
ForbesLindesay

18

글쎄, 나는 게시 직후에 스스로 알아 냈습니다. 가장 당황스러운 방법입니다. :)

StackPanel의 모든 구성원이 최소 요청 크기를 채울 것 같습니다.

DockPanel에서 잘못된 순서로 물건을 도킹했습니다. TextBox 또는 ListBox가 정렬되지 않은 유일한 도킹 된 항목이거나 마지막으로 추가 된 경우 나머지 공간을 원하는대로 채 웁니다.

나는 이것을 처리하는보다 우아한 방법을보고 싶지만 그렇게 할 것입니다.


나는 (이 오래된 질문에!) "정렬없이"가 여기에서 핵심 문구라는 것을 지적하고 싶습니다. 적어도 그것은 나를위한 것입니다.
MikeBaz-MSFT

4

HorizontalAlignmentVerticalAlignment 레이아웃 속성을 사용하십시오 . 요소에 필요한 것보다 많은 공간이있을 때 요소가 부모 내부에있는 공간을 사용하는 방법을 제어합니다.

예를 들어 StackPanel의 너비는 포함 된 가장 넓은 요소만큼 넓습니다. 따라서 모든 좁은 요소에는 약간의 여유 공간이 있습니다. 정렬 속성은 자식 요소가 추가 공간으로 수행하는 작업을 제어합니다.

두 속성의 기본값은 Stretch이므로 사용 가능한 모든 공간을 채우도록 자식 요소가 확장됩니다. 추가 옵션은 왼쪽, 센터에 대한 마우스 오른쪽 버튼으로 포함 HorizontalAlignment로 및 상단, 센터와 바닥 VerticalAlignment를 .


31
이것이 항상 사실이라면, 원래의 질문은 묻지 않았을 것입니다. 예를 들어 Label과 TextBox가있는 가로 StackPanel을 생각해보십시오. TextBox 오른쪽에 여분의 공간이 있습니다. TextBox가 자동 너비로 설정되어 있습니다. HorizontalAlignment에 대해 Stretch를 설정하면 TextBox가 나머지 공간을 채우지 않습니다.
Brent Schooley

항상 사실은 아니지만이 답변은 DockPanel, Image와 같은 내 요구에 적합합니다.
alehro
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.