The tale of a GridViewItem customization

Corrado Cavalli
Corrado Cavalli
Published in
4 min readJan 10, 2014

Once upon a time, in a galaxy not so far away, there was a guy (me

Smile

) who was working on a Windows Store 8.1 application and was asked to create a GridView whose items should look like this picture:

image

The guy (again, me) thought: What’s the problem, did it many times! and he started setting a data source:

public class Item
{
public string Text { get; set; }
}
public class DemoViewModel
{
public DemoViewModel()
{
this.Items = new List<Item>();
for (int i = 0; i < 10; i++)
{
this.Items.Add(new Item() { Text = "Item " + i });
}
}
public IList<Item> Items { get; set; }
}
He then added a GridView to a page, bound the data source and created a simple ItemTemplate:<Page x:Class="GridViewDemo.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:GridViewDemo"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.Resources>
<local:DemoViewModel x:Key="vm"></local:DemoViewModel>
<DataTemplate x:Key="MyItemTemplate">
<Grid Width="100"
Height="60">
<TextBlock HorizontalAlignment="Center"
TextWrapping="Wrap"
Text="{Binding Text}"
VerticalAlignment="Center" />
</Grid>
</DataTemplate>

</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
DataContext="{StaticResource vm}">
<GridView ItemsSource="{Binding Items}"
ItemTemplate="{StaticResource MyItemTemplate}"
/>
</Grid>
</Page>
Run the solution and he got something quite close to what he was asked to realize:
image
Ok, just a couple of customizations and we’re done, he thought…Let’s start with the selected background: The guy knows that background brush is managed inside ItemContainerStyle so he fired up Blend 2013, edited GridView’s ItemContainerStyle and here’s what he got:
image
Just a simple GridViewItemPresenter that has a series of Brush properties that give you the opportunity to customize several container aspects
image
In his case he needed to customize the color of SelectedBackground so, since it is bound to a resource named ListViewItemSelectedBackgroundThemeBrush he added a Brush resource with the same name inside Page resources and selected state was done, here’s updated result:<SolidColorBrush x:Key="ListViewItemSelectedBackgroundThemeBrush"
Color="Orange"></SolidColorBrush>
image
But a question started to rise in his mind: “How to i set default (gray) background color?” there’s no Background color exposed by GridViewItemPresenter nor he can set it inside ItemTemplate otherwise it wouldn’t change when item is selected.He tried lookind inside MSDN docs hoping to find a brush key that controls item default background but he had no luck
Sad smile
and navigated a lot the Internet until he realized he did something similar in the past for a Windows 8.0 application.He then opened that old source code and discovered what has changed: The GridViewItemPresenter has been introduced in Windows 8.1, here’s how ItemContainerStyle looks in Windows 8.0:
image
Since you have access to all the elements composing the GridViewItem what the guy did was copying the style into Windows 8.1 app and edited VisualStateManager states (I’m sure, dear reader, you know how to do that…)So, here’s final result:
image
The guy secretly told me that he wasn’t happy for such solution, probably GridViewItemPresenter has been introduced to improve GridView’s performances but he found no other easier way to solve the puzzle.Based on a true story…
Smile
PS: In case you need Windows 8.0 GridView’s ItemContainerStyle you can get it here.

--

--

Corrado Cavalli
Corrado Cavalli

Senior Sofware Engineer at Microsoft, former Xamarin/Microsoft MVP mad about technology. MTB & Ski mountaineering addicted.