Meediarikaste, interaktiivsete ja muudmoodi udupeenete veebirakenduste, ehk siis Silverlight ja Flash puhul on tihtilugu nii, et nende seisu ei ole võimalik salvestada ja jagada. Url ei muutu ja seega ei saa saata linki sõbrale ega lisada lehte lemmikutesse. Selles postituses püüan olukorda parandada kasutades silda Silverlight rakenduse ja teda sisaldava veebilehe vahel.
HTML Bridge, mis see veel on?
HTML Bridge on mudel/sild, mis võimaldab Silverlight rakenduses kinnituda teda paigutava veebilehe sündmuste külge ja/või muuta selle lehe dokumendiobjektimudelit ehk DOM-i. Vastupidi ka, HTML sild võimaldab host-lehel JavaScriptiga Silverlight rakenduse meetodeid välja kutsuda.
Sellest, kuidas HTML lehe sündmuste külge kinnituda on siin blogis põgusalt juttu olnud (vaata: Hiire kerimisnupp).
Ja DOM-i muutmise näide on siin:
using System.Windows.Browser;
HtmlPage.Document.GetElementsByTagName("title")[0].SetProperty("text", "Tere maailm!");
Navigeerimine
Navigeerimise ehk siis url-i muutmise ning hiljem selle põhjal rakenduse seisu seadmise saavutamegi, kasutades seda silda. Kahjuks päris nii ei saa, et muudame tervet urli, näiteks www.seb.ee/kontojaak aga saab kasutada ankruid – www.minurakendus.ee#muutuja1=tere;muutuja2=maailm
Ülesanne
Rakenduseks on kolme vahelehega rakendus, mille igal lehel on n elementi. Ülesandeks on siis võimalus konkreetsele elemendile rakenduses viidata
Rakendus koosneb kahes Grid paigutushaldurist, milles esimeses asub TabControl ning teises kaks “nuppu” tsitaatide vahel navigeerimiseks. Igas TabControl-i vahelehes on tekstikast tsitaadi jaoks.
XAML
<Grid x:Name="LayoutRoot" Background="White"> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="30"/> </Grid.RowDefinitions> <basics:TabControl x:Name="tab" Width="400" Grid.Row="0"> <basics:TabItem Header="Cicero"> <TextBlock TextWrapping="Wrap"/> </basics:TabItem> <basics:TabItem Header="Oscar Wilde" > <TextBlock TextWrapping="Wrap"/> </basics:TabItem> <basics:TabItem Header="Aristoteles" > <TextBlock TextWrapping="Wrap"/> </basics:TabItem> </basics:TabControl> <Grid Grid.Row="1"> <Grid.ColumnDefinitions> <ColumnDefinition Width="0.5*"/> <ColumnDefinition Width="0.5*"/> </Grid.ColumnDefinitions> <TextBlock x:Name="prev" Text="Eelmine" Grid.Column="0"
HorizontalAlignment="Left"
MouseLeftButtonDown="changeQuote"/> <TextBlock x:Name="next" Text="Järgmine" Grid.Column="1"
HorizontalAlignment="Right"
MouseLeftButtonDown="changeQuote"/> </Grid> </Grid>
URL-i uuendamine
Url-i on vaja uuendada, kui vahetatakse tsitaati või vahelehte, siis kutsutakse välja meetod changeUrl.
private void changeUrl() { HtmlPage.Window.NavigateToBookmark("tab=" + tab.SelectedIndex.ToString() + ";" + "element=" + currentQuote); }
See annab tulemuseks:
Rakenduse seisu taastamine
Mina otsustasin rakenduse seisu taastada pärast seda, kui Page.xaml on edukalt laetud:
this.Loaded += new RoutedEventHandler(Page_Loaded);
void Page_Loaded(object sender, RoutedEventArgs e) { LoadQuotes(); SetState(); }
Kus SetState() meetodi sisu on järgnev:
private void SetState() { // Kas ankur on antud? tab=1;element=17 if (!string.IsNullOrEmpty(HtmlPage.Window.CurrentBookmark)) { // jaotame url-i muutujateks, saame: tab=1 ja element=17 string[] paarid = HtmlPage.Window.CurrentBookmark.Split(';'); // antud on vähemalt 1 muutuja if (paarid.Length > 0) { // eraldame muutuja ja tema väärtuse foreach (string p in paarid) { string[] muutujad = p.Split('='); // tab if (muutujad[0].Equals("tab")) { // string -> int currentTab = Convert.ToInt32(muutujad[1]); if (currentTab <= tab.Items.Count) { // muudame aktiivset vahesakki tab.SelectedIndex = Math.Abs(currentTab); } } // element else if (muutujad[0].Equals("element")) { currentQuote = Convert.ToInt32(muutujad[1]); } } } } setTabContent(); }
setTabContent() Meetodis seame sisuks vastava tsitaadi:
private void setTabContent() { TextBlock t = tab.SelectedContent as TextBlock; t.Text = quotes[currentQuote]; }
Siin on oluline see, et tõlgendaksime tab-i sisu kui TextBlock elementi(millel TextWrapping=Wrap), vastasel juhul kuvataks teksti ühes pikas reas.
Programm, sisaldab veel ka meetodit changeQuote(), mis kutsutakse välja, kui vajutatakse nuppude eelmine/järgmine vajutamise korral. Seal arvutatakse äärmiselt “intelligentse” algoritmi järgi, millist tsitaati näidata ning kutsutakse välja meetodid changeUrl ja setTabContent().
Lõppsõna
Põhimõtteliselt ei ole ju üldse keeruline RIA rakendusi navigeeritavaks teha, aga miskipärast ei ole see eriti levinud. See, kas üldse on vaja teha täis Silverlight rakendusi või võiks piirduda vaid pisikeste Silvelright moodulitega oma kodulehel, on juba teine jutt
Rakendus: