2011-11-10 4 views
2

문제 : 일부 항목에 ItemsControl이있는 창이 있습니다 (사각형이라고합시다). 창에 MinWidth 및 MinHeight가 설정되어 있습니다 (예 : 300). 직사각형에 표시 할 공간이 충분하지 않은 경우 창 크기를 조정할 때 2 열로 표시해야합니다. 그리고 2 열에 여전히 스크롤 뷰어를 표시 할 공간이 충분하지 않은 경우.WPF - IScrollInfo 구현

나는 시도했다 : 1. 확장 ItemsControl을 만들기 :

공용 클래스에는 myGrid : 그리드, IScrollInfo

<ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <local:MyGrid IsItemsHost="True" x:Name="PART_ItemsPanel" Initialized="OnItemsPanelInitialized" CanVerticallyScroll="True" CanHorizontallyScroll="True"> 
      <local:MyGrid.ColumnDefinitions> 
       <ColumnDefinition Width="*"/> 
       <ColumnDefinition Width="*"/> 
      </local:MyGrid.ColumnDefinitions> 
      <local:MyGrid.RowDefinitions> 
       <RowDefinition Height="auto"/> 
       <RowDefinition Height="auto"/> 
       <RowDefinition Height="auto"/> 
       <RowDefinition Height="auto"/> 
      </local:MyGrid.RowDefinitions> 
     </local:MyGrid> 
    </ItemsPanelTemplate> 
</ItemsControl.ItemsPanel> 

내 ItemsControl에는 ItemsPanelTemplate 같은 확장 그리드를 가지고 { .... IScrollInfo 구현 }

ItemsControl이 PrepareContainerForItemOverride() 일 때이 항목을 사용하여 항목을 두 개의 열로 나눌 수 있다고 생각하는 표를 사용합니다.

이데아는 회의에서 "가져옵니다"...하지만 다음에해야 할 일을 알지 못합니다 ... 다음과 같은 질문이 있습니다 : 재정의 할 때 데이터 격자에 대한 측정 및 정렬 위치를 설정했습니다. DataGrid의 항목이지만 PrepareContainerForItemOverride()라고하면 ... 무엇을합니까? 내가해야 할 행을 계산해야합니까? 하지만 그때 나는 다시 창 크기를 조정하면 ... PrepareContainerForItemOverride()는 호출되지 않습니다 ...

그것은 내게이 문제입니다 ... 제게 당신이 가진 것이 있다면 단서를주세요. 감사합니다.

답변

0

.

IScrollInfo의 구현을 피하기 위해 ListBox 컨트롤을 사용하여 ItemsControl을 변경했습니다. 그래서 배열을 오버라이드하는 것이 남아 있습니다. 정렬에서는 첫 번째 열의 항목 높이를 계산하고 GridPanel에서 항목을 정렬합니다. scrollViewer 배열이 항상 유효하지 않기 때문에 dispatcher를 사용하고 표시 높이를 얻으려고합니다.

<ListBox x:Uid="allListBox" x:Name="adminListBoxControl" ItemTemplate ="{DynamicResource LinkButtonItemTemplate}" Margin="15" BorderBrush="Transparent" Background="Transparent"> 
      <ListBox.ItemsPanel> 
       <ItemsPanelTemplate> 
        <local:GridPanel> 
         <local:GridPanel.ColumnDefinitions> 
          <ColumnDefinition Width="0.45*"/> 
          <ColumnDefinition Width="0.45*"/> 
          <ColumnDefinition Width="0.1*"/> 
         </local:GridPanel.ColumnDefinitions> 
         <local:GridPanel.RowDefinitions> 
          <RowDefinition Height="Auto"/> 
          <RowDefinition Height="Auto"/> 
          <RowDefinition Height="Auto"/> 
          <RowDefinition Height="Auto"/> 
          <RowDefinition Height="Auto"/> 
          <RowDefinition Height="Auto"/> 
          <RowDefinition Height="Auto"/> 
          <RowDefinition Height="Auto"/> 
          <RowDefinition Height="Auto"/> 
          <RowDefinition Height="Auto"/> 
         </local:GridPanel.RowDefinitions> 
        </local:GridPanel> 
       </ItemsPanelTemplate> 
      </ListBox.ItemsPanel> 
     </ListBox> 

protected override Size ArrangeOverride(Size finalSize) 
    { 
     Size arrangeSize = base.ArrangeOverride(finalSize); 

     lastItemInFirstColumn = -1; 
     double totalHeight = 0; 

     DispatcherPriority p = ScrollViewer.IsArrangeValid ? DispatcherPriority.Normal : DispatcherPriority.Input; 
     if (o != null) 
      o.Abort(); 

     o = Dispatcher.BeginInvoke(p, (Action)(() => 
     { 
      double fitHeight = ScrollViewer.ActualHeight; 
      foreach (UIElement child in this.InternalChildren) 
      { 
       if (totalHeight + child.DesiredSize.Height < fitHeight) 
       { 
        totalHeight += child.DesiredSize.Height; 
        lastItemInFirstColumn++; 
       } 
       else 
       { 
        if (lastItemInFirstColumn + 1 < InternalChildren.Count - (lastItemInFirstColumn + 1)) 
         lastItemInFirstColumn++; 
        break; 
       } 
      } 

      //set items positions 
      ArrangeItemsInGrid(); 
     })); 

     o.Completed += (s, e) => { o = null; }; 
     return arrangeSize; 
    } 
+1

이것이 효과가있는 해결책이라면이 질문에 대한 답변으로 대답을 수락하십시오. – Nightfirecat

0

내게는 다른 패널이 필요하다는 소리가 ItemsControl에 있습니다. 그것은 당신이 WrapPanel 내장 사용 넘어갈 거라고있을 수 있습니다,하지만 당신은 자신을 작성할 수 있습니다 내가했다 ... 누군가가 그것을 필요로하는 경우 솔루션을 공유하기를 원해요

<ItemsControl ...> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <!-- put whatever panel that encapsulates your layout logic here, possibly your own --> 
      <WrapPanel/> 
     </ItemsPanelTemplate> 
    <ItemsControl.ItemsPanel> 
</ItemsControl> 
+0

답장을 보내 주셔서 감사합니다. 랩 패널을 시도했지만 두 열에 내용을 넣을 수 있어야합니다 (그리고 뷰포트에 맞지 않으면 스크롤 할 수 있어야합니다). 나는 ISCrollViewer를 구현하는 확장 된 Grid를 사용하고 재정의 정렬, 측정을 사용했으며 ... 작동하는 것처럼 보입니다. 나는이 게시물로 돌아갈 때 (... IF ...) 나는 completly 솔루션을 구현합니다. – Victor