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
.