Reputation: 1096
Question: How can I make a Grid
with a ItemsWrapGrid
layout in C#?
Context
Background
I know how to make it in XAML. After creating a new UWP application in Visual Studio 2015, the XAML is:
<Page
x:Class="WrapGridTest001.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:WrapGridTest001"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
MinWidth="10"
MinHeight="10"
>
<Grid x:Name="thisGrid">
<GridView x:Name="thisGridView" IsItemClickEnabled="True">
<GridView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsWrapGrid
x:Name="thisItemsWrapGrid"
Orientation="Horizontal"
MaximumRowsOrColumns="5"
/>
</ItemsPanelTemplate>
</GridView.ItemsPanel>
<TextBlock Text="#1"/>
<TextBlock Text="#2"/>
<TextBlock Text="#3"/>
</GridView>
</Grid>
</Page>
To make it programmatically, I've taken it out of the XAML:
<Page
x:Class="WrapGridTest001.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:WrapGridTest001"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
MinWidth="10"
MinHeight="10"
>
</Page>
and tried to reproduce it in the Page
's constructor:
public MainPage()
{
this.InitializeComponent();
// Make the Grid and set it to be the Page's .Content:
Grid grid = new Grid();
this.Content = grid;
// Make the GridView for the Grid, then set it:
GridView gridView = new GridView();
grid.Children.Add(gridView);
// Make the ItemsPanelTemplate; necessary?
ItemsPanelTemplate itemsPanelTemplate = new ItemsPanelTemplate();
gridView.ItemsPanel = itemsPanelTemplate;
// Make the ItemsWrapGrid. Can't figure out how to set this.
ItemsWrapGrid itemsWrapGrid = new ItemsWrapGrid();
// When I traced the XAML version, its ItemsWrapGrid was apparently under
// gridView.ItemsPanelRoot
// , but that's a get-only property. I can't find a place to set it.
// Add the TextBlock's with "#1", "#2", and "#3":
for (int i = 1; i <= 3; ++i)
{
TextBlock textBlock = new TextBlock();
textBlock.Text = "#" + i.ToString();
gridView.Items.Add(textBlock);
}
// All done. However, this Grid will show contents with a vertical alignment
// rather than a horizontal one.
}
What additional code do I need to add to set the ItemsWrapGrid
in C# as it was set in the XAML? Currently the C# code creates the ItemsWrapGrid
, but the ItemsWrapGrid
isn't actually set anywhere since every attempt to use it so far has resulted in a bug of some sort.
Upvotes: 4
Views: 5616
Reputation: 101
The fact is that the ItemsWrapGrid is the default panel for the GridView. It is not nice that the ItemsPanelTemplate cannot have the ItemsWrapGrid through a property and to use the XamlReader. After the gridview is loaded it gets at ItemsPanelRoot a default ItemsWrapGrid.
yourgridview.Loaded += yourgridview_Loaded;
and the function
private void yourgridview_Loaded(object sender, RoutedEventArgs e)
{
var a = sender as GridView;
var b = a.ItemsPanelRoot;
var c = b as ItemsWrapGrid;
c.MaximumRowsOrColumns = 2;c.Orientation = Orientation.Horizontal;
}
Upvotes: 1
Reputation: 15275
what you need is XamlReader
string template =
"<ItemsPanelTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"><ItemsWrapGrid VerticalAlignment = \"Top\" "
+ " ItemWidth = \""
+ itemWidth
+ "\" Orientation = \"Horizontal\"/></ItemsPanelTemplate> ";
yourgridview.ItemsPanel = (ItemsPanelTemplate)XamlReader.Load(template);
Upvotes: 1