Wersja z 8 października 2011 (Windows 8 Developer Preview)
Interfejs | Metody zdarzeniowe | Kafelek
Cel: Przygotowanie prostej aplikacji (Apps) dla Windows 8 ze zmianą zawartości kafelka. Aplikacja będzie umożliwiała zmianę koloru prostokąta za pomocą czterech suwaków.
Rectangle, cztery suwaki Slider, pole tekstowe TextBox i przycisk Button. Możemy wstępnie rozmieścić je myszką według wzoru na rysunku 1, ale konieczna będzie również edycja kodu XAML. Ostatecznie powinien on wyglądać tak, jak na listingu 1 (proszę zwrócić na atrybuty Name):
Listing 1. Zawartość kontrolki UserControl w pliku MainPage.xaml
<Grid x:Name="LayoutRoot" Background="Navy">
   <Rectangle Name="Rectangle1" HorizontalAlignment="Stretch"  Height="308" Margin="100,100,100,0" Stroke="Black" VerticalAlignment="Top">
      <Rectangle.Fill>
         <SolidColorBrush Color="#50AAFF"/>
      </Rectangle.Fill>
   </Rectangle>
   <Slider Name="SliderR" HorizontalAlignment="Stretch" Height="16" Margin="100,448,100,0" VerticalAlignment="Top" Maximum="255"/>
   <Slider Name="SliderG" HorizontalAlignment="Stretch" Height="16" Margin="100,478,100,0" VerticalAlignment="Top" Maximum="255"/>
   <Slider Name="SliderB" HorizontalAlignment="Stretch" Height="16" Margin="100,508,100,0" VerticalAlignment="Top" Maximum="255"/>
   <Slider Name="SliderA" HorizontalAlignment="Stretch" Height="16" Margin="100,538,100,0" VerticalAlignment="Top" Maximum="255"/>
   <TextBlock Name="TextBlock1" HorizontalAlignment="Left" Height="100" Margin="100,562,0,0" TextWrapping="Wrap" Text="R=0, G=0, B=0, A=255" FontSize="20" VerticalAlignment="Top" Width="372"/>
   <Button Content="Zamknij" HorizontalAlignment="Right" Height="80" Margin="0,0,100,100" VerticalAlignment="Bottom" Width="255"/>
</Grid>
 
Button1_Click dodajemy polecenie widoczne na listingu 2:
Listing 2. Zamykanie aplikacji
private void Button_Click(object sender, RoutedEventArgs e)
{
   //App.Current.Exit();
   Window.Current.Close();
}
Slider w kodzie XAML uzupełniamy o atrybut ValueChanged="Sliders_ValueChanged".
using Windows.UI.Xaml.Media;.
Listing 3. Metody przygotowujące łańcuchy z opisem składowych RGB koloru
private static string SkładoweKoloruDec(Color kolor) { return "R=" + kolor.R.ToString() + ", G=" + kolor.G.ToString() + ", B=" + kolor.B.ToString() + ", A=" + kolor.A.ToString(); } private static string SkładoweKoloruHex(Color kolor) { return "#" + kolor.R.ToString("X") + kolor.G.ToString("X") + kolor.B.ToString("X"); }
Sliders_ValueChanged:
Listing 4. Metoda reagująca na zmiane pozycji suwaków
private void Sliders_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) { Color kolor = new Color() { R = (byte)SliderR.Value, G = (byte)SliderG.Value, B = (byte)SliderB.Value, A = (byte)SliderA.Value }; (Rectangle1.Fill as SolidColorBrush).Color = kolor; TextBlock1.Text = SkładoweKoloruDec(kolor) + "\n"; TextBlock1.Text += "HEX: " + SkładoweKoloruHex(kolor); }
MainPage dodajmy następujący kod:
Listing 5. Konstruktor klasy opisującej stronę
public MainPage() { InitializeComponent(); Color kolor = (Rectangle1.Fill as SolidColorBrush).Color; SliderR.Value = kolor.R; SliderG.Value = kolor.G; SliderB.Value = kolor.B; SliderA.Value = kolor.A; }
 

TileUpdater i dwie metody zmieniające zawartość kafelka. Pierwsza będzie na nim wyświetlać tylko tekst (za to w trzech liniach), druga - obraz z opisem:
Listing 6. Metody zmieniające zawartość kafelka
TileUpdater tu = TileUpdateManager.CreateTileUpdaterForApplication(); public void zmienWygladKafelka(Color kolor) { XmlDocument xml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileWideText01); IXmlNode wezelTekst = xml.GetElementsByTagName("text").First(); wezelTekst.AppendChild(xml.CreateTextNode("Kolory:")); wezelTekst = xml.GetElementsByTagName("text").Item(1); wezelTekst.AppendChild(xml.CreateTextNode(SkładoweKoloruDec(kolor))); wezelTekst = xml.GetElementsByTagName("text").Item(2); wezelTekst.AppendChild(xml.CreateTextNode("HEX: " + SkładoweKoloruHex(kolor))); tu.Update(new TileNotification(xml)); } public void zmienWygladKafelkaZObrazem(Color kolor) { XmlDocument xml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileWideImageAndText); IXmlNode wezelTekst = xml.GetElementsByTagName("text").First(); wezelTekst.AppendChild(xml.CreateTextNode(SkładoweKoloruDec(kolor))); XmlElement elementObraz = xml.GetElementsByTagName("image").First() as XmlElement; elementObraz.SetAttribute("src", "package://images\\WideLogo.png"); elementObraz.SetAttribute("alt", SkładoweKoloruHex(kolor)); tu.Update(new TileNotification(xml)); }
Button1_Click i konstruktora podając jako argument lokalne zmienne kolor.
