2017-09-29 87 views
1

我想要實現一個GridView,它將一行中的3個項目,並且如果最後一行中的項目數量是2,那麼最後一行項目應該對齊中心而不是左對齊,對齊。這裏有幾張圖片來解釋我想實現的目標。中心對齊最後一行中的GridView項目

目前我的實現看起來像

this

這就是我想要實現的。

this

任何幫助,將不勝感激。

回答

0

有許多方法可以實現您提到的功能。總而言之,您需要繼承GridView並覆蓋MeasureOverrideArrangeOverride方法來重新計算Panel的子項的每個Rect。這種方式很複雜。欲瞭解更多信息,你可以參考 XAML custom panels overview

而且您還可以使用PrepareContainerForItemOverride方法直接重新佈置該項目。

<local:VariableGrid 
      x:Name="MyGridView" 
      SelectionMode="Single"  
     IsSwipeEnabled="False"> 
    <local:VariableGrid.ItemTemplate > 
     <DataTemplate> 
      <StackPanel BorderBrush="Red" BorderThickness="3" Height="200" Width="200" Margin="20"> 
      </StackPanel> 
     </DataTemplate> 
    </local:VariableGrid.ItemTemplate> 
    <local:VariableGrid.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VariableSizedWrapGrid 
       Orientation="Horizontal" 
       VerticalAlignment="Top" 
       ScrollViewer.HorizontalScrollMode="Enabled" 
       ScrollViewer.VerticalScrollMode="Disabled" 
       MaximumRowsOrColumns="4"> 
      </VariableSizedWrapGrid> 
     </ItemsPanelTemplate> 
    </local:VariableGrid.ItemsPanel> 
</local:VariableGrid> 

VariableGrid.cs

public sealed class VariableGrid : GridView 
{ 
    public VariableGrid() 
    { 
     this.DefaultStyleKey = typeof(VariableGrid); 
    } 
    protected override void PrepareContainerForItemOverride(DependencyObject element, object item) 
    { 
     var list = this.ItemsSource as List<string>;  
     var griditem = element as GridViewItem;   
     for (var t = ((list.Count - list.Count % 4)); t < list.Count; t++) 
     { 
      if (item as string == list[t]) 
      { 
       if (griditem != null) 
       { 
        VariableSizedWrapGrid.SetColumnSpan(griditem, 2); 
       } 
      } 
     } 
     base.PrepareContainerForItemOverride(element, item); 
    } 
} 

enter image description here

然而,這個簡單的方法不能適合所有的情況。

+0

謝謝。你能否提供你在這個運行示例中使用的代碼? – aadilp

+0

是的,[this](https://github.com/ZhuMingHao/GridViewFlowTest.git)是代碼示例。 –