EvenTiles from Start to Finish - Part 9
In the previous episode of this series about how to develop a Windows Phone application from scratch we talked about restoring the entire page state after the application returns from the background. Today we finally are going to add a Secondary Tile to our application.
Each application has at least one tile, the Application Tile, which end users can pin to the start screen on their phone. In the very first episode of this series we defined the contents for the backside of the Application Tile in the manifest file of our application. Each application can also create one or more Secondary Tiles. Once a Secondary Tile is created programmatically, it will immediately be pinned to the start screen. Secondary Tiles can be removed again programmatically, but the end user can also remove Secondary Tiles from the start screen of their phone.
To add a Secondary Tile to the start screen, our application’s
MainPage will host a button. When the user clicks the button, a new
Secondary Tile is created. After creation, our application is moved to
the background by the operating system in order to show the start screen
with our newly created secondary tile, that is initialized in such a
way that it contains both a front- and backside.
You can see the Secondary Tile being pinned on the start screen. You
can also see that the Secondary Tile has two different sides, each with
their own image and the backside containing an additional string, the
string that the user can enter in the SettingsPage of the application.
If the user returns to the application when the Secondary Tile is
installed, they have the possibility to remove the Secondary Tile again
from the start screen programmatically.
To find out if our Secondary Tile is currently visible on the start
screen of the phone, we just check if it is defined in our application’s
collection of tiles. This collection of ActiveTiles always contains at
least the Application Tile and optionally all Secondary Tiles that were
created in the application. When we are navigating to the MainPage of
the application, we can find out if our Secondary Tile is available by
executing the following code:
Secondary Tile Active?
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
secondaryTileInstalled = ShellTile.ActiveTiles.FirstOrDefault(x => x.NavigationUri.ToString().Contains("TileId=Secondary")) != null;
btnInstall.Content = secondaryTileInstalled ? txtRemoveTile : txtInstallTile;
}
In this code snippet, we use a lambda expression on the static collection of ActiveTiles
to find the first tile that contains the following string in its Uri:
TileId=Secondary. The Application Tile does not contain this additional
information, so if we find a tile with this string being part of its
Uri, we can safely assume that this is our Secondary Tile. In that case,
we set a boolean variable to true. Depending on the presence or absence
of a Secondary Tile we also modify the Content property of the button.
Of course we also need to create / delete the Secondary Tile, which is
something that we will do inside the Click event handler of the button
we created on the MainPage:
Creating / Deleting Sec. Tiles
private void btnInstall_Click(object sender, RoutedEventArgs e)
{
if (secondaryTileInstalled)
{
var secondaryTile = ShellTile.ActiveTiles.FirstOrDefault(x => x.NavigationUri.ToString().Contains("TileId=Secondary"));
if (secondaryTile != null)
{
secondaryTile.Delete();
btnInstall.Content = txtInstallTile;
secondaryTileInstalled = false;
}
}
else
{
StandardTileData newTileData = new StandardTileData
{
BackgroundImage = new Uri("Background.png", UriKind.Relative),
Title = "EvenTiles",
Count = 0,
BackBackgroundImage = new Uri("Backbackground.png", UriKind.Relative),
BackTitle = "EvenTiles",
BackContent = App.ActualSecBackContent
};
ShellTile.Create(new Uri("/MainPage.xaml?TileId=Secondary", UriKind.Relative), newTileData);
}
}
In the above code snippet the first thing we do is verify if a
Secondary Tile is installed. If so, we simply call the Delete method on
it to remove it from the start screen on the phone. As visual feedback
to the user, we immediately change the content property of the button to
show a string to add another Secondary Tile. If we don’t have a
Secondary Tile, what we are going to do is create and initialize a new
instance of StandardTileData.
Through its properties, this object will hold the complete
characteristics of our new Secondary Tile. To create the Secondary Tile,
we simply call the static Create
method of the ShellTile class, passing a navigation string, indicating
to which page we should go in our application when the user clicks the
Secondary Tile. In this way, you can use Secondary Tiles to link to any
page inside your application. You can also pass your own parameters to
the navigation URI, which can help you take different actions if a page
is invoked from a Secondary Tile. Together with the navigation URI, you
also pass the StandardTileData to create the Secondary Tile. Immediately
after calling the ShellTile.Create method, our application is moved to
the background by the operating system and the start screen with our
newly created Secondary Tile becomes visible. If you click on the
phone’s back button, our application returns to the foreground (from
either a tombstoning or dormant state). On the other hand, if the user
clicks on the Secondary Tile, a new instance of our application is
started and the instance of our application that was still available in
the background is removed. This behavior implies that we don’t have to
modify the text of the button in case of creating a live tile, because
OnNavigatedTo will always execute before our MainPage becomes visible
again.
The following video shows step-by-step how to create and delete
Secondary Tiles programmatically. It also shows our Secondary Tile in
action. Of course, this sample application is very simple, but hopefully
you can see the potential, not only for having Live Tiles available for
an application, but also to make use of Secondary Tiles to allow the
user to immediately navigate to a particular page of your application.
If you want to take a look at the source code that we have available
for EvenTiles so far, you can download the entire solution belonging to
this episode:
Download EvenTiles Episode 9 Source Code
After downloading and unzipping the sample code, you can open the EvenTiles solution in Visual Studio 2010 Express for Windows Phone. You must have the Windows Phone SDK 7.1 installed on your development system to do so. If you have a developer unlocked phone you can deploy the application to your phone, if you don’t have a developer unlocked phone you can still experiment with this application inside the emulator.
In the next episode of EvenTiles we will introduce a more advanced
topic when we are beginning to talk about making use of a background
agent to allow our application to execute some code, even when it is not
in the foreground.
Source: http://mstruys.com/2011/12/16/eventiles-from-start-to-finishpart-9/
(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)





