2010-02-25 8 views
0

현재 각 항목이 가로로 쌓여 있고 GridSplitter로 구분 된 ItemsPanel로 Grid를 사용하는 ItemsControl 용 ControlTemplate을 작성하려고합니다.ItemsPanel vs Grid vs GridSplitter

기본 목표는 동적으로 바인딩 가능한 ItemsControl을 갖는 것입니다. 여기서는 모든 항목이 행으로 쌓여 있고 각 항목은 스플리터로 크기를 조정할 수 있습니다.

내 머리를 감쌀 수없는 두 가지가 있습니다. GridSplitter가 각 항목 사이에서 자동으로 끝나는 방법은 무엇입니까? 각 항목에 대해 Grid.Column을 어떻게 설정합니까?

간단한 제어 템플릿으로는이 작업을 수행 할 수없는 경우 이와 비슷한 것을 구현하는 가장 일반적인 방법은 무엇입니까? 이것을 위해 새 ItemsControl을 작성해야합니까?

사용자 지정 ControlTemplates가있을 수 있도록 실제 (Grid) 분할 자 컨트롤이 필요합니다. 또한 세포 (GridLengthUnitType, 늘이기, 정렬)에 대한 추가 레이아웃 기능을 사용하는 것이 매우 편리하다고 생각합니다.

내 자신을 롤업 할 때 사용자 정의 ItemsControl (각 항목에 대해 스플리터를 생성 함)과 사용자 정의 패널 (onerow/onecolumn 그리드와 같이 동작 함 - 첨부 된 Grid.Row, Grid.Column 속성, .Orientation으로 충분할 것입니다.) Splitter 컨트롤을 사용할 수 있고 레이아웃 작업을 처리하는 방법을 알고 있습니다.

이 접근 방식에 대해 어떻게 생각합니까? 선호되었거나 좋은 방법입니까?

답변

0

그리드 스플리터를 자체 열에 배치해야합니다. 그리드에 한 행만 있다고 가정하면 모든 항목에 대해 Grid.Row를 설정할 필요가 없습니다. 원하는 경우 0으로 설정할 수 있습니다 (첫 번째 행).

사용자 지정 컨테이너를 직접 작성하는 것이 좋습니다. 어쩌면 그리드 대신 스택 패널을 기반으로 할 수 있습니다. 나는 gridsplitter가 자기 자신의 양쪽에있는 아이템의 크기에 영향을 줄 것이라고 믿는다. (나는 당신이 원하는 것은 그것의 크기를 조정하는 것을 제외하고는 모든 것을 이동시키는 것이다.)

+0

나는 행과 열이 섞여 있다고 생각합니다. 위에서 말했듯이 위의 시나리오에서는 항목이 한 행에 쌓이기를 원하기 때문에 (항목이 많아서) 항목의 열 사이에 많은 수의 gridsplitters를 추가해야합니다. 물론 똑같은 것이 수직 방향에 적용된다고 쉽게 상상할 수 있습니다. – bitbonk

+0

확인. 그런 다음 행과 열을 전환하십시오. 그에 따라 내 대답이 바뀌 었습니다. –

+0

실제 (Grid) Splitter 컨트롤이 필요하므로 사용자를위한 ControlTemplates가있을 수 있습니다. 또한 세포 (GridLengthUnitType, 늘이기, 정렬)에 대한 추가 레이아웃 기능을 사용하는 것이 매우 편리하다고 생각합니다. 그래서 사용자 정의 ItemsControl (각 항목에 대해 스플리터를 생성)과 사용자 정의 패널 (onerow/onecolumn 그리드와 같이 동작합니다.)이 필요합니다. 따라서 첨부 된 Grid.Row, Grid.Column 속성, .Orientation에 대한 필요성은 없습니다. 충분하다). 이것은 분배 자 제어를 취할 수 있으며 배치와 관련하여 분배자를 다루는 방법을 알고있다. – bitbonk

2

제 생각에 ItemsControl은 각 항목에 대해 하나의 컨트롤 만 만들어 itemshost에 추가된다는 아이디어에 기반하고 있습니다. 항목별로 GridSplitter와 기본 항목 컨테이너를 만드는 것은이 원칙에 위배됩니다.

열이 하나 뿐이므로 세로로 크기를 조정하려는 경우 StackPanel처럼 작동하지만 항상 자식 요소 사이에 약간의 간격을 두는 자체 패널을 작성하는 것이 좋습니다. 마우스가이 간격을 초과하고 사용자가 드래그하기 시작하면 패널은 가장 가까운 하위 요소의 크기를 조정할 수 있습니다.

크기 조정 논리는 사용자 지정 패널에서 구현해야합니다. 가장 큰 단점은 생각하지만 IMO는 한 곳에 모아 있기 때문에 가치가 있습니다. 이 패널을 itemshost로 사용하는 것 외에는 ItemsControl/ItemTemplate/ItemContainerStyle에서 특별한 작업을 수행 할 필요가 없습니다.

표준 StackPanel을 사용하여 크기 조정 논리를 구현하는 마우스 처리기를 추가 할 수도 있습니다. 하지만 갭을 만들기 위해서는 ItemContainerStyle에 여백을 설정해야합니다.

+0

한 가지 문제가 있습니다. 스플리터 부분에 대한 컨트롤 템플릿을 작성할 수 있어야합니다. – bitbonk

+0

아, 알 겠어 ... 나는 아이템 컨트롤을 사용하는 것이 옵션이라고 생각하지 않는다. – Bubblewrap