A short demo on how to dynamically load content in a Windows Phone Pivot
control, where the contents of each PivotItem
have been extracted into a user control.
First we define the Pivot
control in MainPage.xaml:
<phone:Pivot Title="pivot demo" LoadingPivotItem="OnLoadingPivotItem">
<phone:PivotItem Header="pivot 1" Margin="0,0,-12,0" />
<phone:PivotItem Header="pivot 2" Margin="0,0,-12,0" />
<phone:PivotItem Header="pivot 3" Margin="0,0,-12,0" />
</phone:Pivot>
You can see that we just define regular Pivot
control with three PivotItem
entries. The entries at the moment do not contain any content. We will be dynamically setting the content of the pivot items in the OnLoadingPivotItem
method that is fired when the Pivot
control requests a pivot item to be loaded. This method is implemented as follows:
private void OnLoadingPivotItem(object sender, PivotItemEventArgs e)
{
// Do not set the content of the pivot item if the content has already been set
if (e.Item.Content != null)
{
return;
}
// Create the user control for the selected pivot item
var pivotItemContentControl = CreateUserControlForPivotItem(((Pivot)sender).SelectedIndex);
// Update the content of the pivot item
e.Item.Content = pivotItemContentControl;
}
private static UserControl CreateUserControlForPivotItem(int selectedIndex)
{
switch (selectedIndex)
{
case 0:
return new PivotItem1Content();
case 1:
return new PivotItem2Content();
case 2:
return new PivotItem3Content();
default:
throw new ArgumentOutOfRangeException("selectedIndex");
}
}
We can see that the first check in the OnLoadingPivotItem
is whether the pivot item already has its content set. If so, we can immediately return. If not, we need to create the correct content control. We do this in the CreateUserControlForPivotItem
, which uses the selected index of the pivot control to determine the corresponding content control. The final step is to set the content of the pivot item to the created control. The pivot item content controls are very simple. The content contrel for the first pivot item looks as follows:
using System.Windows.Controls;
public partial class PivotItem1Content : UserControl
{
public PivotItem1Content()
{
this.InitializeComponent();
}
}
<UserControl x:Class="PivotContentDemo.PivotItem1Content"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:phoneApp4="clr-namespace:PivotContentDemo"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
mc:Ignorable="d"
d:DesignHeight="480" d:DesignWidth="480">
<Grid x:Name="LayoutRoot">
<TextBlock>pivot item 1 content</TextBlock>
</Grid>
</UserControl>
We have now achieved lazy-loading of pivot items, where the pivot items have been extracted into their own controls.