2017-09-29 6 views
1

Je souhaite implémenter un GridView qui prend 3 éléments d'affilée, et si le nombre d'éléments est 2 dans la dernière rangée, les éléments de la dernière rangée doivent être alignés au centre au lieu d'être à gauche- aligné. Voici quelques images pour expliquer ce que je veux réaliser.Alignement central des éléments GridView sur la dernière ligne

Actuellement ma mise en œuvre ressemble

this.

Et c'est ce que je veux réaliser.

this

Toute aide serait appréciée.

Répondre

0

Il existe de nombreuses façons de réaliser la fonctionnalité que vous avez mentionnée.

Pour résumer, vous avez besoin d'hériter GridView et passer outre MeasureOverrideArrangeOverride méthode pour recalculer chaque Rect des enfants du Groupe spécial. Cette voie est complexe. Pour plus d'informations, vous pouvez vous référer à XAML custom panels overview.

Et vous pouvez également utiliser la méthode PrepareContainerForItemOverride pour redimensionner l'élément directement.

<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

Cependant, cette façon simple ne peut tout le scénario.

+0

Merci. Pouvez-vous s'il vous plaît fournir le code que vous avez utilisé dans cet exemple? – aadilp

+0

Oui, [this] (https://github.com/ZhuMingHao/GridViewFlowTest.git) est un exemple de code. –