2017-03-22 14 views
3

Page 안에는 TreeView이 있습니다. ItemsControl 안에있는 것들을 페이지 가장자리에서 스크롤하는 대신 줄 바꿈하는 방법은 무엇입니까? WrapPanel은 아무 것도하지 않는 것 같습니다.WPF 'TreeView'내의 항목 감싸기

리프 항목을 랩핑하는 방법을 묻는 것과 같지 않습니다. ItemsControl을 랩핑 할 필요는 없지만 ItemsControl 안에 내용을 래핑해야합니다.

<TreeView 
    VirtualizingPanel.IsVirtualizing="True" 
    VirtualizingPanel.VirtualizationMode="Recycling" 
    VirtualizingPanel.ScrollUnit="Pixel" 
    VirtualizingPanel.IsVirtualizingWhenGrouping="True" 
    Name="Tree"> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate 
      DataType="{x:Type viewModel:HighLevelItem}" 
      ItemsSource="{Binding MidLevelItems}"> 
      <TextBlock 
       Text="{Binding HighLevelName}"/> 
      <HierarchicalDataTemplate.ItemTemplate> 
       <DataTemplate 
        DataType="{x:Type viewModel:MidLevelItem}"> 
        <Expander> 
         <Expander.Header> 
          <TextBlock 
           Text="{Binding MidLevelName}"/> 
         </Expander.Header> 
         <Expander.Content> 
          <ItemsControl 
           ItemsSource="{Binding LowLevelItems}"> 
           <ItemsControl.ItemsPanel> 
            <ItemsPanelTemplate> 
             <WrapPanel 
              Orientation="Horizontal"/> 
            </ItemsPanelTemplate> 
           </ItemsControl.ItemsPanel> 
           <ItemsControl.ItemTemplate> 
            <DataTemplate> 
             <TextBlock 
              Text="{Binding LowLevelName}"/> 
            </DataTemplate> 
           </ItemsControl.ItemTemplate> 
          </ItemsControl> 
         </Expander.Content> 
        </Expander> 
       </DataTemplate> 
      </HierarchicalDataTemplate.ItemTemplate> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

... 여기에 몇 가지 유형의 정의는 다음과 같습니다

public class HighLevelItem 
{ 
    public MidLevelItem[] MidLevelItems { get; set; } 
    public string HighLevelName { get; set; } 
} 
public class MidLevelItem 
{ 
    public LowLevelItem[] LowLevelItems { get; set; } 
    public string MidLevelName { get; set; } 
} 
public class LowLevelItem 
{ 
    public string LowLevelName { get; set; } 
} 

... 다른 곳 코드에서이 (웁니다 TreeView를 얻기 위해) :

Tree.Items = new[] { new HighLevelItem { HighLevelName = "ALPHA", MidLevelItems = Enumerable.Repeat(0, 1000).Select(_ => new MidLevelItem { MidLevelName = Guid.NewGuid().ToString(), LowLevelItems = Enumerable.Repeat(0, 1000).Select(__ => new LowLevelItem { LowLevelName = "ff" }).ToArray() }).ToArray() } }; 

이 또한주의 항목을 가로로 정렬하려면 해당 레이어가 필요하므로 다른 계층 적 데이터 템플릿을 계속 사용하는 대신 Expander을 사용하고 0을 Orientation으로 변경하십시오. 트리 내의 임의의 레이어에서은 다른 레이어와 다를 수 있습니다. breaks UI virtualization for the entire tree when that layer is expanded. 따라서 위 트리의 모든 VirtualizingStackPanel에는 세로/기본 방향이 있고 마지막 레이어의 가로 배열은 Expander입니다.

위의 내용은 다음과 같습니다. "ALPHA"는 TopLevelItem이며, GUID를이 MidLevelItem들, 그리고 각 진수 쌍은 (당신이 포장되지 알 수 있지만, 가장자리를지나 계속 해 서있는) 개인 LowLevelItem입니다 :

Screenshot of the above code

+0

처음부터 문제를 재현하는 데 사용할 수있는 샘플 데이터를 제공하십시오. https://stackoverflow.com/help/mcve – mm8

+0

@ mm8 방금 편집 한 스크린 샷이 도움이되는지 알려주십시오. –

+0

확실히 그렇지 않습니다. 누구나 Visual Studio에 붙여 넣을 수있는 코드 조각을 제공하고 문제를 재현하기 위해 실행해야합니다. – mm8

답변

1

당신은 지정해야 Expander, 예를 들면의 Width는 :

<Expander Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType=TreeView}}"> 
... 

당신하여 TreeViewActualWidth에서 왼쪽 가장자리 측에서 오프셋 빼는 컨버터 또는 무언가를 사용할 수 있습니다.