Igor Kulman

Renderovanie XAML na Live Tile vo Windows Phone 7

· Igor Kulman

Štandardné Windows Phone 7 API umožňuje pri vytváraní Live Tiles zvoliť názov, obrázok prednej a zadnej strany a číselný počet. Obrázky je nutné poskytnúť vo forme Uri. Ak nechcete používať vždy rovnaký statický obrázok ale chcete ho generovať dynamicky, dokonca zo XAML elementov, nie je to žiadny problém.

Pomocou XAML elementov môžete presne vyjadriť obsah obrázka na Live Tile alebo ako Live Tile použiť časť obrazovky, čo sa môže niekedy hodiť. Princíp je jednoduchý, ak chcete ako obrázok na Live Tile použiť napríklad StackPanel s obrázkom:

StackPanel sp = new StackPanel 
{ 
  Height = 173, 
  Width = 173, 
  Background = (SolidColorBrush) Application.Current.Resources["PhoneBackgroundBrush"] 
}; 

Image img = new Image 
{ 
  Width = 100, 
  Height = 100, 
  Stretch = Stretch.UniformToFill, 
  Source = ..., 
  VerticalAlignment = VerticalAlignment.Center, 
  HorizontalAlignment = HorizontalAlignment.Center 
}; 

sp.Children.Add(img); 

je potrebné najprv vytvoriť novú WriteableBitmap s rozmermi 173x173

var wbm = new WriteableBitmap(173, 173);

a následne do nej vykresliť požadovaný XAML obsah

wbm.Render(sp, null); 
wbm.Invalidate();

Vytvorenú WriteableBitmap následne uložíte do IsolatedStorage

string sIsoStorePath = @"\Shared\ShellContent\tile.png"; 
using (IsolatedStorageFile appStorage = IsolatedStorageFile.GetUserStoreForApplication()) 
{ 
  String sDirectory = System.IO.Path.GetDirectoryName(sIsoStorePath); 
  if (!appStorage.DirectoryExists(sDirectory)) 
  { 
    appStorage.CreateDirectory(sDirectory); 
  } 

  using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(sIsoStorePath, System.IO.FileMode.Create, appStorage)) 
  { 
    wbm.SaveJpeg(stream, 173, 173, 0, 100); 
  } 
}

a vytvoríte samotnú LiveTile

ShellTile.Create(new Uri(...), new StandardTileData 
{ 
  Title = this.PageTitle.Text, 
  BackgroundImage = new Uri("isostore:/Shared/ShellContent/tile.png", UriKind.Absolute) 
});