How to Display Gridview items with variable width

2019-03-28 13:33发布

问题:

My GridView items having the size of it's first item size. How do i can change this behaviour ?

How to display GridView items with variable Width as per the content ?


I want to show the first one but i am getting second one.
Any suggestion to do that?

回答1:

Check Windows 8 GridView and Variable-Sized Items and Different Sized Tile Items in WinRT GridView and also check Variable Sized Grid Template
Hope this help



回答2:

You can create such view of GridView by setting ItemsPanel to WrapPanel, you can get WrapPanel on Jerry Nixon's blog. Here's the code.

XAML

<GridView x:Name="gv">
    <GridView.ItemsPanel>
        <ItemsPanelTemplate>
            <local:WrapPanel Orientation="Horizontal"  />
        </ItemsPanelTemplate>
    </GridView.ItemsPanel>
    <GridView.ItemTemplate>
        <DataTemplate>
            <Grid Height="140" Width="{Binding MyWidth}">
                <Grid.Background>
                    <SolidColorBrush Color="{Binding MyColor}" />
                </Grid.Background>
                <TextBlock FontSize="20" VerticalAlignment="Bottom" Margin="10,0,0,10">
                    <Run Text="{Binding MyWidth}" />
                </TextBlock>
            </Grid>
        </DataTemplate>
    </GridView.ItemTemplate>
</GridView>

C#

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    var list = new List<ViewModel>() 
    {
        new ViewModel(110, Colors.LawnGreen),
        new ViewModel(50, Colors.DarkBlue),
        new ViewModel(130, Colors.Firebrick),
        new ViewModel(60, Colors.RosyBrown),
        new ViewModel(100, Colors.IndianRed),
        new ViewModel(210, Colors.BurlyWood),
        new ViewModel(150, Colors.Turquoise)
    };

    gv.ItemsSource = list;
}

public class ViewModel
{
    public double MyWidth { get; set; }
    public Color MyColor { get; set; }

    public ViewModel(double _MyWidth, Color _MyColor)
    {
        MyWidth = _MyWidth;
        MyColor = _MyColor;
    }
}


回答3:

Here is my solution.

//variable sized grid view

public class VariableSizedGridView : GridView
{
    protected override void PrepareContainerForItemOverride(Windows.UI.Xaml.DependencyObject element, object item)
    {
        try
        {
            dynamic gridItem = item;

            var typeItem = item as CommonType;
            if (typeItem != null)
            {
                var heightPecentage = (300.0 / typeItem.WbmImage.PixelHeight);
                var itemWidth = typeItem.WbmImage.PixelWidth * heightPecentage;
                var columnSpan = Convert.ToInt32(itemWidth / 10.0);


                if (gridItem != null)
                {
                    element.SetValue(VariableSizedWrapGrid.ItemWidthProperty, itemWidth);
                    element.SetValue(VariableSizedWrapGrid.ColumnSpanProperty, columnSpan);
                    element.SetValue(VariableSizedWrapGrid.RowSpanProperty, 1);
                }
            }
        }
        catch
        {
            element.SetValue(VariableSizedWrapGrid.ItemWidthProperty, 100);
            element.SetValue(VariableSizedWrapGrid.ColumnSpanProperty, 1);
            element.SetValue(VariableSizedWrapGrid.RowSpanProperty, 1);
        }
        finally
        {
            base.PrepareContainerForItemOverride(element, item);
        }
    }

//Collection View source

     <CollectionViewSource  x:Name="collectionViewSource"
                           Source="{Binding ImageList,Mode=TwoWay}"
                           IsSourceGrouped="False"
                           ItemsPath="Items" />   

//variable sized Grid view xaml

     <controls:VariableSizedGridView x:Name="ImageGridView"
                      AutomationProperties.AutomationId="ImageGridView"                            
                      ItemsSource="{Binding Source={StaticResource collectionViewSource}}" 
                      IsItemClickEnabled="True"
                      TabIndex="1" >
     <controls:VariableSizedGridView.ItemTemplate>
     <DataTemplate>
    <Grid Height="300" >
        <Image Stretch="Uniform" Source="{Binding WbmImage}" />
    </Grid>
    </DataTemplate>
    </controls:VariableSizedGridView.ItemTemplate>
                <controls:VariableSizedGridView.ItemsPanel>
                    <ItemsPanelTemplate>
                        <VariableSizedWrapGrid  ItemWidth="10"   ItemHeight="300" Orientation="Vertical"/>
                    </ItemsPanelTemplate>
                </controls:VariableSizedGridView.ItemsPanel>                  
    </controls:VariableSizedGridView>