Sledujte nás na YouTube

Pokročilé použitie WebBrowser komponenty vo Windows Phone 7

Ak potrebujete vo svojej Windows Phone 7 aplikácii zobraziť kus HTML kódu, jedinou možnosťou je použiť komponentu WebBrowser. Táto komponenta nefunguje úplne ideálne, existujú však spôsoby, ako jej nedostatky prekonať.

Ak potrebujete vo svojej Windows Phone 7 aplikácii zobraziť, alebo skôr vyrenderovať, kus HTML kódu, v podstate jedinou možnosťou je použiť komponentu WebBrowser. Táto komponenta nefunguje úplne ideálne, existujú však spôsoby, ako jej nedostatky prekonať.

Základné použitie komponenty

Základnou metódou komponenty WebBrowser je Navigate, ktorá zobrazí webovú stránku podľa Uri. Uri môže byť absolútna (webová URL) alebo relatívna v rámci Isolated Storage. Ak si chcete pri zobrazovaní HTML dokumentov z Isolated Storage ušetriť písanie cesty, môžete nastaviť vlastnosť  Base a cesty udávať relatívne k takto nastavenému adresáru. V podstate akýkoľvek HTML kód uložený v stringu je možné zobraziť pomocou metódy NavigateToString.

Vizuálna chybička

WebBrowser má po vizuálnej stránke ako komponenta vždy biele pozadie (nepodporuje priehľadnosť). Zobrazované pozadie je možné ovplyvniť vrámci HTML. Ak teda máte XAML stránku s iným ako bielym pozadím a použijete na nej WebBrowser na zobrazenie HTML s rovnakým pozadím ako vaša XAML stránka, vyvoláte tým síce konzistentný dojem, bude to však mať malú chybičku. Kým sa dané HTML v komponente WebBbroser zobrazí, bude celý priestor zabraný touto komponentou biely (príkladom je aplikácia WinMag).

Riešenie tejto chybičky je pomerne jednoduché. Komponente nastavte Visibility=Collapsed, čo zabezpečí, aby nebola po zobrazení XAML stránky viditeľná. V obsluhe eventu LoadCompleted, ktorý sa vyvolá po zobrazení požadovaného HTML, zmeňte Visibility na Visible.

Príklad:

XAML

<phone:WebBrowser Visibility=“Collapsed“ Name=“browser“/>

C#

browser.LoadCompleted += (s, args) => (s as WebBrowser).Visibility = System.Windows.Visibility.Visible;

Potlačenie zoomu a scrollingu

Ak používate WebBrowser na zobrazenie HTML obsahu s presnou výškou, je ideálne nastaviť vlastnosť IsHitTestVisible na false a zabrániť používateľovi v interakciách s komponentou.

Ak zobrazujete rôzne množstvo obsahu a požadujete možnosť scrollovania, odporúčam vypnúť  zoom a ďalšie gestá. V prípade, že v komponente dynamicky meníte zobrazované HTML, nefungujú tieto gestá úplne správne a môže sa vám stať, že sa nový HTML obsah z času na čas zobrazí s veľkým zoomom alebo podobnou vadou (príkladom je aplikácia ČT24, skúste si v nej prudký scrolling smerom dole, WebBrowser preskočí na iný článok a ešte aj občas zazoomovaný).

Riešením je použitie triedy WebBrowserHelper od Colina Eberharta, ktorá potlačí zoom a v prípade potreby aj scrolling.

Priklad:

C#

WebBrowserHelper wbh = new WebBrowserHelper(browser1);

Vykonávanie skriptov

Ak má WebBrowser nastavenú vlastnosť IsScriptEnabled na true, je možné v ňom vykonávať JavaScript pomocou metódy InvokeScript. Výsledok vykonaného JavaScriptu je možné získať a spracovať v C# kóde.

Aby to fungovalo, musí JavaSript volať metódu window.external.notify. Parameter tejto metódy je potom prístupný ako hodnota v obsluhe eventu ScriptNotify.

Príklad:

Javascript

window.external.Notify(1)

C# 

browser1.ScriptNotify += (s, args) =>

{

    WebBrowser thisBrowser = (WebBrowser)sender;

    int height = Convert.ToInt32(args.Value);

   

};

Zobrazenie odkazov v prehliadači

Ak HTML, ktoré v komponente WebBrowser zobrazujete, obsahuje odkazy, môže byť žiaduce nezobrazovať ich v tejto komponente ale v systémovom prehliadači (napríklad odkazy na weby bez mobilnej verzie).

Riešením je použiť event Navigating a v ňom sa napríklad podľa URL rozhodnúť, či použiť komponentu alebo systémový prehliadač. Použitie systémového prehliadača je možné pomocou WebBrowserTask, je však nutné potlačiť navigáciu vrámci komponenty nastavením vlastnosti Cancel triedy NavigationEventArgs na true.

Príklad:

C#

webBrowser1.Navigating += (s, args) =>

{

    if (someCondition) {

        args.Cancel = true;

        WebBrowserTask task = new WebBrowserTask();

        task.URL = args.Uri.ToString();

        task.Show();

    }

};

O autorovi – Igor Kulman

-Som absolventom softvérového inžinierstva na MFF UK v Prahe a aktuálne pracujem ako Windows Phone 7 vývojár vo firme Inmite. V minulosti som pôsobil v oblasti systémovej integrácie pre korporátnych zákazníkov. Mám skúsenosti s vývojom aplikácií na platformách .NET a PHP a v súčasnosti smerujem k Azure a Windows 8. Svoje názory publikujem na blogu, zopár článkov nájdete aj na Zdrojáku alebo v starších číslach magazínu PC Revue.

Igor Kulman

Jeden komentář

  1. aerkain (neregistrovaný)

    Dobre diky. Jen bych dodal ze s navigateToString jsem mel problemy s kodovanim. Da se to obejit tak ze se html text ulozi do isol. stor. a pak se odnaviguje komponenta pres tenhle soubor.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *