HTML kuvamine ja sidumine WebBrowser külge

Silverlight 4 tõi võimaluse näidata rikast HTML sisu otse Silverlight rakenduse sees. Muidugi on siin väike piirang, WebBrowser kasutajaliideseelementi saab kasutada vaid töölauale paigaldatud ehk OOB rakendustes. Sisu kuvamiseks on kaks viisi – esiteks võib seada WebBrowser elemendil Source atribuudi väärtuseks veebiaadressi. Teise võimalusena saab laadida veebilehe sisu stringina kasutades meetodit NavigateToString.

WebBrowser ja andmemall

Iseenesest on WebBrowser mõlemad sisukuvamise variandid kenad, kuid jooksvalt muutuva HTML korral ei ole lihtsat viisi see HTML XAMLis külge panna, eriti kui WebBrowser komponent asub DataTemplate’i (andmemalli) sees, mille komponentidele lihtsasti nime kaudu ligi ei saa. Seega on ainus võimalus WebBrowser komponenti laiendada. Üheks võimaluseks on lisada WebBrowserile (XAML) atribuut, mis kutsub iga muutumise korral välja enda meetodi NavigateToString. Sellise atribuutide lisamise skeemi nimetus on attached properties ehk vabameelselt tõlkides näiteks külgepoogitavad atribuudid. Sellised atribuudid on näiteks Canvas.Left ja Grid.Row, need on atribuudid, mis on võimalik lisada ükskõik millisele Silverlight kasutajaliidese komponendile (UIElement tüüpi).

WebBrowser komponendi sidumine

Selleks, et saaksime WebBrowseri HTML-i muuta ilma, nii et ei peaks käsitsi välja kutsuma selle konkreetse WebBrowseri meetodit NavigateToString loome uue külgepoogitava atribuudi html. Igal korral kui selle atribuudi väärtus muutub kutsutakse välja meetod OnHtmlChanged ja seal sees kutsutakse selle konkreetse WebBrowser komponendi meetod NavigateToString, mille külge atribuut poogitud on.

image thumb HTML kuvamine ja sidumine WebBrowser külge

Ja nüüd on lihtne XAML koodis WebBrowseris kuvatavat HTMLi muuta:

image thumb1 HTML kuvamine ja sidumine WebBrowser külge

Külgepoogitavatest atribuutidest (attached properties) võib lähemalt lugeda MSDNist

TextBlock ja xml:space=”preserve”

Varem on igati tüütu olnud reavahetustega tekst Silverlight TextBlockide sees… Selleks tuli siis sobilike kohtade peale lisada näiteks </Linebreak> või \n. Nüüd on Silverlight end kokku võtnud ning respekteerib XML standardis olevat xml:space=”preserve” atribuuti.

Seega, kui kirjutada


<TextBlock xml:space="preserve"> 

<TextBlock.Text> Mina olen üks suur, pikk

mitmerealine teskst ...

</TextBlock.Text>

</TextBlock>

Siis nii ongi, reavahetused on rakenduses näha ja kui kõrvuti on mitu tühikut, siis on mitu tühikut kõrvuti ka rakenduse käivitamisel :) .

Cool :)