NetStudent.cz - články v kategorii Silverlight http://www.netstudent.cz/Articles/?tag=silverlight&author= Nejnovější články na webu NetStudent.cz v kategorii Silverlight Fri, 14 May 2024 07:19:18 +0200 6f673f2f-6a05-4440-8ba6-d53ad77cba41 http://xaml.cz/silverlight/ms-silverlight-media-framework/ Jirka Pénzeš MS Silverlight Media Framework Open source knihovna Microsoft Silverlight Media Framework je určená pro vývojáře, kteří chtějí snadno nasadit multimediální obsah do svých aplikací. Hlavní částí frameworku je mediální přehrávač, který si poradí se spousty video formáty, je vysoce škálovatelný, přizpůsobitelný a v neposlední řadě funkčně velmi robustní. Mon, 10 Jan 2025 10:00:00 +0100 bc53dd31-53f4-436c-a80a-fcb120a0185e http://smartmania.mobilmania.cz/index.php?ind=news&op=news_show_single&ide=1376 Tomáš Slavíček Vyvíjíme aplikace pro Windows Phone 7: Jak začít a co budeme potřebovat? Přáli jste si někdy nahlédnout pod pokličku vývoje her a aplikací pro operační systém Windows Phone 7? Tento článek by měl být prvním z krátké série o vývoji aplikací pro novou mobilní platformu Microsoftu. Půjde vlastně rozcestník pro začínající programátory, kteří by zde měli nalézt odpovědi na základní otázky a informace o tom, s jakými omezeními je ze strany operačního systému nutné počítat. Mon, 08 Nov 2024 00:00:00 +0100 0367311e-4389-4d0e-9d4a-bc877401a321 http://aglight.cz/Silverlight/Detail/41 David Beinhauer Silverlight 4 - Window Closing Event Window Closing event je nová událost, která se vyvolá v případě uzavření aplikace běžící mimo prohlížeč. K uzavření aplikace může dojít po uživatelově akci (zavření aplikace pomocí křížku v pravém horním rohu) nebo v rámci systému (např. odhlášení). Pokud je původcem uživatel, pak můžeme uzavření aplikace zrušit. Díky této události můžeme vyvolat různé akce, které se vykonají před samotným uzavřením aplikace. Chceme-li zrušit uzavření aplikace, pak nastavíme vlastnost Cancel na hodnotu true. Vlastnost Cancel je dostupná z parametru ClosingEventArgs. Před samotným nastavením vlastnosti Cancel je dobré zjistit, zda-li uzavření aplikace bylo vyvoláno uživatelem. To zjistíme přes vlastnost IsCancelable, která je dostupná taktéž v rámci parametru ClosingEventArgs. Ukázka V této ukázce si ukážeme, jak zamezit uzavření aplikace uživateli. Prezentační vrstva není pro tuto ukázka důležitá, proto se budeme věnovat kódu v pozadí. Nejprve naší aplikaci nastavme možnost běhu mimo prohlížeč. Klepneme pravým tlačítkem na projekt a vybereme možnost Vlastnosti / Properties. Zde vybereme záložku Silverlight a zaškrtneme možnost běhu mimo prohlížeč / Enable running application out of the browser. Nyní přidáme událost Loaded, která je vyvolána při načtení aplikace.To můžeme udělat tak, že se přepneme do XAMLu. Ve vlastnostech se přepneme na události (znak blesku) a vybereme událost Loaded. V poli pro výběr dvakrát klikneme a vygeneruje se nám prázdná metoda reagující na událost Loaded. Nyní se přepneme do dané metody, která reaguje na událost Loaded. V první řadě zjistíme, zda-li aplikace běží mimo prohlížeč. To vcelku snadno zjistíme přes vlastnost IsRunningOutOfBrowser. if (Application.Current.IsRunningOutOfBrowser) { } Pokud aplikace běží mimo prohlížeč, pak zaregistrujeme událost Closing. Window app = Application.Current.MainWindow; app.Closing += (s, args) => { }; Do aplikace jsem si přidal jeden checkbox, pomocí kterého budu moci aplikaci uzavřít. V případě, že bude checkbox zaškrtnutý, aplikace bude moci být uzavřena uživatelem. V rámci události přidáme další podmínku, která zjistí stav checkboxu a také, zda-li uzavření aplikace bylo vyvoláno uživatelem. if (checkBox1.IsChecked == false && args.IsCancelable) { } V podmínce přidáme vlastnost Cancel nastavenou na true. Tím pádem uživatel nebude schopen aplikaci uzavřít. Celý kód by pak vypadal následovně: private void UserControl_Loaded(object sender, RoutedEventArgs e) { if (Application.Current.IsRunningOutOfBrowser) { Window app = Application.Current.MainWindow; app.Closing += (s, args) => { if (checkBox1.IsChecked == false && args.IsCancelable) { args.Cancel = true; } }; } } Shrnutí Událost Closing pro detekci uzavření aplikace běžící mimo prohlížeč Vlastnost IsCancelable zjistí původce uzavření aplikace Vlastnost Cancel nastavená na hodnotu true znemožní uzavření aplikace Vlastnost Cancel pouze v případě, že původcem uzavření je uživatel Sun, 30 May 2024 00:00:00 +0200 4197f481-2a40-4e55-85ea-a7492c3dec32 http://aglight.cz/Silverlight/Detail/35 David Beinhauer Zajímavé články týdne http://bit.ly/cUZJFp Silverlight aplikace pracující s oData službou http://bit.ly/98RRe1 Drag&Drop v komponentě TreeView http://bit.ly/a5AKkL Rozsáhlý průvodce o Windows Phone 7 http://bit.ly/cjgepP První z tutoriálů o programování ve WP7 pro Silverlight vývojáře http://bit.ly/bFRXNl Pokročilé techniky tisku v Silverlightu http://bit.ly/9ieV5m Hlasujte nebo navrhněte vylepšení, které byste chtěli v Silverlightu vidět Sun, 23 May 2024 00:00:00 +0200 4472b040-424e-4142-aafc-6e9d5b2813fd http://aglight.cz/Silverlight/Detail/34 David Beinhauer Silverlight 4 - WebBrowserBrush WebBrowserBrush patří do jmenného prostoru System.Windows.Controls. Podobně jako u jiných druhů štětců můžeme WebBrowserBrush aplikovat jako výplň primitiv(čtverec, elipsa), jako pozadí prvku Canvas apod. Postup užití WebBrowserBrush je následující: Vytvořit komponentu WebBrowser s nastaveným zdrojem(Source) a jménem(Name) Aplikovat WebBrowserBrush na objekt, který má obsah webové stránky zobrazit V rámci štětce nastavit jméno zdroje(SourceName) na danou WebBrowser komponentu Pokud se změní obsah komponenty WebBrowser a tuto změnu chceme zobrazit v rámci štětce, pak je nutné zavolat metodu Redraw. Omezení WebBrowserBrush je aplikován pouze v případě běhu aplikace mimo prohlížeč(Out Of the Browser). To vychází z chování komponenty WebBrowser, která umožňuje renderovat obsah webové stránky pouze v OOB. Zobrazená HTML stránka je neinteraktivní. Je nutné mít komponentu WebBrowser. Ukázka Následující ukázka bude velice primitivní, jelikož si zatím nedokážu představit nějaké rozumnější využití tohoto druhu štětce. Tedy pro úplnost ukážu, jak zobrazit obsah webové stránky uvnitř elipsy. Nejdříve je nutné si nadefinovat komponentu WebBrowser: <WebBrowser Name="webbrowser" Source="http://www.aglight.cz" Width="400" Height="400" Visibility="Collapsed" /> Nastavili jsme viditelnost prvku na Collapsed. Nechceme mít komponentu WebBrowser zobrazenou v aplikaci. Nyní vytvoříme objekt elipsy, který bude vyplněn obsahem komponenty WebBrowser: <Ellipse Height="500" Width="500"> <Ellipse.Fill> <WebBrowserBrush SourceName="webbrowser" x:Name="webbrush"/> </Ellipse.Fill> </Ellipse> Obsah WebBrowserBrush se nastavuje přes vlastnost SourceName. Dále je nutné zavolat metodu Redraw, aby se obsah komponenty WebBrowser reflektoval do naší elipsy. To můžeme učinit například při pohybu myši v rámci manažeru rozvržení(Layout Manager). private void LayoutRoot_MouseMove(object sender, MouseEventArgs e) { webbrush.Redraw(); } Webová stránka je zobrazena pouze v režimu mimo prohlížeč. Výsledná aplikace: Shrnutí Štětec, který se stará o zobrazení obsahu webové stránky, se nazývá WebBrowserBrush Je nutné mít komponentu WebBrowser, která slouží jako zdroj pro štětec Metoda Redraw pro aktualizaci WebBrowserBrush Pouze v režimu OOB Zobrazená HTML stránka není interaktivní Sun, 23 May 2024 00:00:00 +0200 5853fc70-a229-4298-a90a-76bdfb7028d7 http://aglight.cz/Silverlight/Detail/30 David Beinhauer Silverlight 4 - Podpora tisku Podpora tisku je zabezpečená třídou PrintDocument ze jmenného prostoru System.Windows.Printing. Tato třída nám umožňuje jak tisk celé aplikace, tak tisk jednotlivých částí aplikace. Kromě toho můžeme tisknout komponenty, které nejsou součástí vizuálního stromu. Při vyvolání tisku se uživateli zobrazí standardní dialogové okno pro tisk. Třída PrintDocument nabízí tři události, které jsou vyvolány v průběhu tiskové operace. Události jsou: BeginPrint – je vyvolána ve chvíli, kdy potvrdíme tisk. (Po stisknutí tlačítka Print/Tisk v dialogu) PrintPage – je vyvolána v rámci samotného tisku, pro každou stránku je vyvolána zvlášť EndPrint – je vyvolána po ukončení tisku Událost BeginPrint můžeme použít na přípravu dokumentu k tisku a k jiným úkonům, které se provedou před samotným tiskem. Pomocí události PrintPage nastavíme komponentu, která se má tisknout. To se nastavuje přes vlastnost PageVisual z parametru PrintPageEventArgs. PageVisual je typu UIElement. Můžeme tisknout jak celou aplikaci, tak i její část. Pokud chceme tisknout celou aplikaci, pak jako PageVisual nastavíme kořenový prvek aplikace (LayoutRoot). Událost EndPrint signalizuje konec tisku a zde můžeme podniknout úkony vztahující se k ukončení tisku. Můžeme například informovat uživatele, že tisk byl úspěšně dokončen. Popřípadě můžeme obsloužit chyby, které při tisku mohly nastat. K otevření dialogu se používá metoda Print(string documentName), jako parametr je předáno jméno tisknutého dokumentu. Metoda Print musí být vyvolána akcí uživatele, aby nedošlo k vyvolání vyjímky(Security Exception). Jednoduše můžeme tisk popsat jako posloupnost následujících kroků: Vytvoříme novou instanci třídy PrintDocument Obsloužíme událost PrintPage, kde nastavíme obsah tisku, velikost objektu, který chceme tisknout apod. Zavoláme metodu Print, které předáme jméno dokumentu jako argument Omezení Pokud chceme tisknout více stran, pak je nutné nastavit vlastnost HasMorePages z PrintPageEventArgs na hodnotu true. Je ale nutné, aby si programátor tisk jednotlivých stran obsloužil sám. Současná třída PrintDocument je koncipována na tisk jedné strany a tisk více stran není až tak jednoduchý úkol. Více informací, jak se s tiskem více stran vypořádat, najdete na adrese http://bit.ly/degIFU . Ukázka V aplikaci budu mít objekt, který jsem si nakreslil v rámci nástroje Expression Design. Tento objekt je popsán pomocí jazyka XAML. Dále zde budu mít dvě tlačítka, která budou provádět samotný tisk. První tlačítko vytiskne celý obsah aplikace, zatímco druhé pouze daný objekt. Jelikož XAML kód není v této aplikaci podstatný, ukážeme si pouze aplikační logiku. Každé ze dvou tlačítek implementuje událost kliknutí (Click). Podívejme se, jak by tisk vypadal v případě tisku celé aplikace. V rámci metody, která reaguje na událost kliknutí, přidáme následující kód: private void Button_Click(object sender, RoutedEventArgs e) { //1. Vytvoříme instanci třídy PrintDocument PrintDocument doc = new PrintDocument(); //vyvolána před samotným tiskem doc.BeginPrint += (s, args) => { //TODO volitelné nastavení před samotným tiskem }; //vyvolána po tisku doc.EndPrint += (s, args) => { //TODO volitelné nastavení po samotném tisku }; //2. událost je vyvolána pro každou tisknutou stránku aplikace doc.PrintPage += (s, args) => { //nastavení obsahu tisku, v tomto případě celá aplikace args.PageVisual = LayoutRoot; }; //3. Zobraz uživateli dialog pro tisk doc.Print("Celá aplikace"); } Jako tisknutý prvek jsme nastavili celou aplikaci. To znamená, že jsme vlastnosti PageVisual přiřadili kořenový element aplikace. V našem případě je to komponenta Grid se jménem LayoutRoot. Nyní požadujeme tisk jednoho objektu. My si vybereme objekt, který jsem si před tím připravil v Expression Designu. Tento objekt je pojmenován jako “moucha”. Proto do vlastnosti PageVisual bude předáno jméno objektu “moucha”. Kód aplikace je totožný s předešlým příkladem až na vlastnost PageVisual. private void button1_Click(object sender, RoutedEventArgs e) { //1. Vytvoříme instanci třídy PrintDocument PrintDocument doc = new PrintDocument(); //vyvolána před samotným tiskem doc.BeginPrint += (s, args) => { //TODO volitelné nastavení před samotným tiskem }; //vyvolána po tisku doc.EndPrint += (s, args) => { //TODO volitelné nastavení po samotném tisku }; //2. událost je vyvolána pro každou tisknutou stránku aplikace doc.PrintPage += (s, args) => { //nastavení obsahu tisku, v tomto případě objekt moucha args.PageVisual = moucha; }; //3. Zobraz u6ivateli dialog pro tisk doc.Print("Moucha"); } Výsledná aplikace Pro kontrolu tisku doporučuji tisk do XPS Microsoft Document Writeru. Občas můžeme chtít, aby tisknutý objekt zabíral celou tisknutelnou oblast. To se dá udělat tak, že tisknutelnému elementu nastavíme výšku a šířku podle vlastnosti PrintableArea z parametru PrintPageEventArgs. Poté můžeme vrátit objekt na původní hodnoty například v rámci události EndPrint. Více informací o této možnosti najdete na adrese http://bit.ly/a3oQpe , kde je to aplikováno na grafech z balíku Silverlight Toolkit. Shrnutí Tisk zajišťuje třída PrintDocument Událost PrintPage je vyvolána při tisku stránky Vlastnost PageVisual nastavuje objekt pro tisk Metoda Print(string documentName) zobrazí uživateli dialog pro tisk Fri, 14 May 2024 00:00:00 +0200 a2918581-3813-4b49-a457-bd259b0003d5 http://aglight.cz/Silverlight/Detail/29 David Beinhauer Silverlight 4 - Drag&Drop Drag&Drop můžeme využít v řadě případů. Představme si například situaci, kdy máme webovou aplikaci, na kterou se dají nahrávat obrázky. Uživatel může tyto obrázky nahrát standardně přes nějaký dialog a nebo může využít funkcionalitu Drag&Drop. Tedy může přetáhnout soubory ze svého lokálního počítače přímo do aplikace. Druhá varianta bude rozhodně pohodlnější. Pokud chceme, aby komponenta fungovala jako místo, kde se dá daný soubor “upustit” (Drop), pak nastavíme vlastnost AllowDrop na hodnotu true. Tím říkáme, že komponenta je připravena přijmout soubor, který na ní přetáhneme (Drag). Z komponenty se stává cíl přesunu(Drop Target). Tuto vlastnost podporují všechny komponenty typu UIElement. Nastavením této vlastnosti se nám zpřístupní čtyři události, které můžeme dále využít. Jednotlivé události jsou: DragEnter – přetáhnutý objekt vstoupí do cílové komponenty (Drop Target) DragLeave – přetáhnutý objekt opustí cílovou komponentu DragOver – přetáhnutý objekt je nad cílovou komponentou Drop – přetáhnutý objekt je “upuštěn” do cílové komponenty V drtivé většině případů si vystačíme s událostí Drop. Jediným podporovaným formátem je datový formát FileDrop. To se velmi liší od technologie WPF, kde datových formátů je celá řada. V dalších verzích Silverlightu je však plánováno toto množství zvýšit. Každá událost obsahuje parametr typu DragEventArgs. DragEventArgs obsahují vlastnost Data, která zpřístupňuje přetáhnuté objekty. Tuto vlastnost, která je typu IDataObject, využijeme pouze v případě události Drop. V jiných událostech může být přístup do vlastnosti Data ukončen výjimkou(SecurityException). Dobrým zvykem je na začátku zkontrolovat, zda-li přesunutý objekt je typu, který očekáváme. Momentálně je tato podmínka bezpředmětná kvůli jedinému podporovanému formátu FileDrop. V budoucích verzích bychom ale na to neměli zapomenout. if (e.Data.GetDataPresent("FileDrop")) Pokud chceme získat přesunuté objekty, využijeme k tomu metodu GetData(string format). Pole objektů, které se nám vrátí z metody GetData, můžeme přetypovat na pole typu FileInfo. Jeden objekt typu FileInfo odpovídá jednomu přetáhnutému souboru. Z objektu FileInfo lze získat další důležité informace jako je jméno souboru, velikost apod. FileInfo[] droppedFiles = e.Data.GetData(DataFormats.FileDrop) as FileInfo[]; Omezení Jak bylo na začátku zmíněno, tak jediným podporovaným formátem je formát typu FileDrop. Nemůžeme tak přetahovat například adresáře. Drag&Drop nám nebude fungovat v režimu Full-Screen či v módu windowless. Na platformě Macintosh tak budeme muset obejít tento nedostatek pomocí patřičné HTML DOM události. Ale to taky nemusí znamenat stoprocentní funkcionalitu v jiném prohlížeči. Pokud nemáme aplikace v režimu zvýšené důvěryhodnosti (Elevated-Trust), pak nejsme schopni zjistit cestu k souboru resp. adresář, kde se soubor nachází. Každý takový pokus skončí výjimkou(SecurityException). Ukázka V naší aplikaci budeme mít objekt typu Canvas, který bude sloužit jako cíl našeho přesunu (DropTarget). Na Canvas budeme moci umisťovat obrázky s příponou JPG nebo JPEG. Ostatní formáty nebudou podporovány. V XAMLu si vytvořím objekt typu Canvas, který budeme mít vlastnost AllowDrop nastavenou na true. Tím se z našeho Canvase stane objekt, který je schopný obsloužit přetáhnutý soubor. <Canvas x:Name="LayoutRoot" AllowDrop="True" Background="AntiqueWhite" /> Nyní tomuto objektu přidáme událost Drop. <Canvas x:Name="LayoutRoot" AllowDrop="True" Background="AntiqueWhite" Drop="LayoutRoot_Drop" /> Přepneme se do dané metody, která je vyvolána události Drop a napíšeme aplikační kód pro obsluhu "upuštěného" souboru. V první řadě otestujeme, zda-li přesunutý objekt odpovídá našemu požadovanému typu. Bez této podmínky bychom se docela obešli, ale je dobrým zvykem tuto podmínku použít pro pozdější verze Silverlightu, kde datových formátů bude větší množství. if (e.Data.GetDataPresent("FileDrop")) { } Nyní je třeba získat pole přetáhnutých objektů, které přetypujeme na pole typu FileInfo[] FileInfo[] droppedFiles = e.Data.GetData(DataFormats.FileDrop) as FileInfo[]; Nyní toto pole můžeme projít, například pomocí cyklu foreach. My si každý objekt převedeme na objekt typu Image, který následně vložíme na plochu Canvasu. Před samotným zpracováním jednotlivých objektů je zapotřebí zkontrolovat, zda-li s daným objektem chceme pracovat. V našem případě budeme pracovat pouze s obrázky s příponou JPG nebo JPEG. Proto budeme kontrolovat příponu přesunutého objektu. Příponu zjistíme pomocí vlastnosti Extension. foreach (FileInfo droppedFile in droppedFiles) { if (droppedFile.Extension.Equals(".jpg", StringComparison.InvariantCultureIgnoreCase) || droppedFile.Extension.Equals(".jpeg", StringComparison.InvariantCultureIgnoreCase)) { } } Nyní přidáme kód pro převedení objektu FileInfo na objekt Image. Obrázek bude "upuštěn" na místo, kde byl naposledy kurzor myši. To zařídíme pomocí vlastnosti Margin. Následně obrázek přidáme do Canvasu. FileStream fileStream = droppedFile.OpenRead(); { BitmapImage bi = new BitmapImage(); bi.SetSource(fileStream); Image img = new Image() { Source = bi, Margin = new Thickness(e.GetPosition(LayoutRoot).X, e.GetPosition(LayoutRoot).Y, 0, 0), Width=100 }; LayoutRoot.Children.Add(img); } Celý kód obsluhující metody vypadá následovně: private void LayoutRoot_Drop(object sender, DragEventArgs e) { if (e.Data.GetDataPresent("FileDrop")) { FileInfo[] droppedFiles = e.Data.GetData(DataFormats.FileDrop) as FileInfo[]; foreach (FileInfo droppedFile in droppedFiles) { if (droppedFile.Extension.Equals(".jpg", StringComparison.InvariantCultureIgnoreCase) || droppedFile.Extension.Equals(".jpeg", StringComparison.InvariantCultureIgnoreCase)) { FileStream fileStream = droppedFile.OpenRead(); { BitmapImage bi = new BitmapImage(); bi.SetSource(fileStream); Image img = new Image() { Source = bi, Margin = new Thickness(e.GetPosition(LayoutRoot).X, e.GetPosition(LayoutRoot).Y, 0, 0), Width = 100 }; LayoutRoot.Children.Add(img); } } } } } Výsledná aplikace Do Canvasu přetáhněte obrázek s příponou JPG nebo JPEG. Obrázek bude vložen na místo, kde byl naposledy kurzor myši. Aplikace umožňuje přetáhnutí více obrázku, ale “vykreslen” bude jen jeden. Je to z toho důvodu, že aplikace nemá připravenou logiku pro obsluhu více přetáhnutých obrázků. Můžeme například použít StackPanel pro rozmístění nebo jinou logiku, která bude splňovat naše požadavky. Shrnutí Vlastnost AllowDrop = “true” nastaví komponentu jako cíl přetáhnutí (DropTarget) Událost Drop je vyvolána po “upuštění” souborů Jediný povolený formát FileDrop Z parametru DragEventArgs lze získat pole přetáhnutých objektů pomocí metody GetData(string format) Pole objektů získáných pomocí metody GetData lze přetypovat na FileInfo objekty Vlastnost Data z DragEventArgs je typu IDataObject Nefunguje na platformě Macintosh, nutné obsloužení přes patřičnou událost v rámci HTML DOM Wed, 12 May 2024 00:00:00 +0200 32554003-0a31-4c72-85ab-a9ad45140e08 http://aglight.cz/Silverlight/Detail/28 David Beinhauer Zajímavé články týdne http://bit.ly/aLahWS Velice jednoduchý trik pro plynulejší rolování v ListBoxu. http://bit.ly/9pEYQc Jakým způsobem lze zabezpečit Silverlight aplikaci se dozvíte v tomto článku. http://bit.ly/cTkP6U Tento článek Vám ukáže, jak digitálně podepsat XAP soubor a zvýšit tak důvěryhodnost aplikace. http://bit.ly/9lFStk Silverlight 4 a tisk grafů. http://bit.ly/9eKky4 Dokument popisuje ochranu uživatele před útoky škodlivých webových stránek a vybudování bezpečné aplikace. http://bit.ly/b9kKiz Tři nejčastější otázky k OOB a odpovědi na ně od Jeremyho Liknesse. Sun, 09 May 2024 00:00:00 +0200 8e542761-16fe-41d7-a67f-5b532e995d0f http://aglight.cz/Silverlight/Detail/24 David Beinhauer Silverlight 4 - Podpora kolečka myši Implicitně je kolečko myši podporováno v komponentách ComboBox, DataPicker, Calendar, TextBox, ScrolViewer, DataGrid a ListBox. Pohyb kolečka myši je zajištěn události MouseWheel. Ta nám poskytuje parametr typu MouseWheelEventArgs, který obsahuje vlastnost Delta. Tato vlastnost je důležitá k tomu, abychom vyhodnotili pohyb kolečka myši. Delta může nabývat hodnoty 120 pro pohyb kolečka vpřed a hodnotu –120 pro pohyb kolečka vzad. Omezení Událost MouseWheel není podporována na platformě Macintosh a zároveň není podporována v rámci módu “windowless” v prohlížečích Firefox, Chrome, Opera, Safari. V rámci těchto omezení lze jako alternativu zvolit užití HTML DOM události. Musíme však počítat s nedostupností podpory kolečka v rámci režimu Full-Screen a také v režimu mimo prohlížeč (OOB). Ukázka Tato aplikace obsahuje komponentu Calendar, ListBox a ScrollViewer. Tyto tři komponenty implicitně podporují pohyb kolečka myši. Další dvě komponenty typu Image a Slider již obsluhu události musí mít implementovanou. Slider bude pohybovat posuvník při pohybu kolečka myši a obrázek zase bude rotovat. Label s textem “Hodnota Delty:” nám v případě vyvoláni události MouseMove nad komponentou Slider nebo Image sděluje aktuální hodnotu vlastnosti Delta. Implementaci události MouseWheel si ukážeme na komponentě Slider. V XAMLu jsme si přidali komponentu Slider a k ní událost MouseWheel. <slider x:name="slider" mousewheel="slider_MouseWheel"></slider> V implementaci metody reagující na událost máme tento kód: private void slider_MouseWheel(object sender, MouseWheelEventArgs e) { e.Handled = true; if (e.Delta > 0) slider.Value += 1; else slider.Value -= 1; } Vlastnost Handled z parametru MouseWheelEventArgs je nastavena na true, a to z toho důvodu, aby nám událost dále neprobublávala směrem nahoru a neodchytila ji jiná komponenta (např. ScrollViewer) implementující událost MouseWheel. V rámci podmínky ověřujeme, zda-li vlastnost Delta je kladná či záporná. Podle toho nastavujeme posun v Slideru. Je-li Delta záporná, tedy pohyb kolečka je vzad, pak posun v Slideru je směrem zpět. V případě kladné Delty je pohyb opačný. Výsledná aplikace Shrnutí Událost MouseWheel Implicitní MouseWheel u komponenty Calendar, ComboBox, ListBox, TextBox, DataPicker, ScrollViewer, DataGrid Vlastnost Delta z MouseWheelEventArgs určuje pohyb kolečka Nepodporováno na platformě Macintosh a v rámci windowless ve Firefoxu, Chrome, Safari a Opera. Sat, 08 May 2024 00:00:00 +0200 6af2d863-8d76-4fd7-b39f-b0951787a1bf http://aglight.cz/Silverlight/Detail/23 David Beinhauer Silverlight 4 - Výukový kurz Na stránkách Channel9 naleznete aktuální výukový kurz pro čtvrtou generaci Silverlightu. Training kit je koncipován do 8 modulů, přičemž každý z těchto modulů se skládá z Hands-on Labů a videí demonstrujících jednotlivé novinky a možnosti, které poslední verze Silverlightu nabízí. Namátkou Drag&Drop, RichText Box, MEF, vylepšené možnosti OOB (Out Of The Browser), WCF RIA services, MVVM apod. Všechny Hands-on Laby jsou vedeny jasnou a srozumitelnou formou a u každého labu je doprovázející zdrojový kód. Lze stáhnout offline verzi na adrese http://bit.ly/6JDwwL a nebo online na adrese http://bit.ly/kXTdY. Vaší pozornosti by neměly ujít i jiné zajímavé kurzy. Jmenujme za všechny Windows Phone 7 Developer Training Kit, Windows Azure Platform Training Course atd. Všechny kurzy naleznete na této adrese http://channel9.msdn.com/learn/. Kurzy jsou vedeny v anglickém jazyce. Thu, 06 May 2024 00:00:00 +0200 69d50857-e6d4-42d5-a221-5efe1db20d21 http://aglight.cz/Silverlight/Detail/19 David Beinhauer Silverlight 4 - Kontextové menu [Sledujte také náš twitter @Aglightcz, kde naleznete krátké zprávy nejen o novinkách na našem webu] Podpora pravého tlačítka myši je zastoupena dvěma událostmi (events), které se dají vyvolat na všech elementech typu UIElements. Těmito událostmi jsou: MouseRightButtonDown MouseRightButtonUp Obě tyto události jsou tzv. Routed events a tedy jsou podobné událostem kliknutí levého tlačítka myši. Abychom mohli událost kliknutí tlačítka obsloužit je nutné tuto událost zastavit před dalším “probubláváním” ve vizuálním stromě. Toho docílíme pomocí vlastnosti Handled, kterou nastavíme na true. Tím zaručíme to, že se nám nebude objevovat standardní kontextové menu. Kontextové menu je otevřeno právě při události MouseRightButtonDown, což se liší od WPF, kde kontextové menu bylo vyvoláno při události MouseRightButtonUp. V události MouseRightButtonUp nastavíme naše kontextové menu. Omezení V Silverlight SDK neexistuje žádná třída, která by implementovala kontextové menu. To ovšem neznamená, že by zde neexistoval způsob jak si takové menu vytvořit. Pro účely kontextového menu můžeme použít komponentu Popup. Pakliže chceme sáhnout po hotovém řešení, je vhodnou volbou komponenta ContextMenu z balíku Silverlight toolkit. A při troše hledání lze na internetu najít další kontextová menu, která jsou šířena zdarma. Ukázka V následující ukázce budeme nahrazovat standardní menu vlastním. Jako kontextové menu použijeme komponentu Popup. Vytvořme tedy nový projekt a do něj vložme komponentu Popup. Vizuální obsah si můžeme zvolit libovolně, ale viditelnost prvku (Visibility) nastavíme na Collapsed. Nechceme, aby prvek byl viditelný dokud ho nevyvoláme pravým tlačítkem. XAML kód by mohl vypadat například takhle: <Gridx:Name="LayoutRoot"Background="AliceBlue"><Popupx:Name="ContextMenu"Visibility="Collapsed"><BorderBackground="Bisque"BorderBrush="Azure"BorderThickness="1"><Border.Effect><DropShadowEffectColor="Bisque"ShadowDepth="2"/></Border.Effect><StackPanel><HyperlinkButtonNavigateUri="#"Content="Item#1"/><HyperlinkButtonNavigateUri="#"Content="Item#1"/></StackPanel></Border></Popup></Grid>.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Nyní modifikujme XAML kód tak, že prvku Grid přidáme dvě události – MouseRightButtonDown a MouseRightButtonUp: <Gridx:Name="LayoutRoot"Background="AliceBlue"MouseRightButtonDown="LayoutRoot_MouseRightButtonDown"MouseRightButtonUp="LayoutRoot_MouseRightButtonUp"><Popupx:Name="ContextMenu"Visibility="Collapsed"IsOpen="False"><BorderBackground="Bisque"BorderBrush="Azure"BorderThickness="1"><Border.Effect><DropShadowEffectColor="Bisque"ShadowDepth="2"/></Border.Effect><StackPanel><HyperlinkButtonNavigateUri="#"Content="Item#1"/><HyperlinkButtonNavigateUri="#"Content="Item#1"/></StackPanel></Border></Popup></Grid> Přepneme se do aplikačního kódu (Code behind), kde v metodě MouseRightButtonDown nastavíme vlastnost Handled na hodnotu true. Tím si zajistíme to, že se nám nebude zobrazovat konfigurační menu Silverlightu. privatevoid LayoutRoot_MouseRightButtonDown(object sender, MouseButtonEventArgs e) { e.Handled = true; }.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Nyní je potřeba upravit metodu MouseRightButtonUp, která bude zavolána následně za metodou MouseRightButtonDown. Popis jednotlivých částí je uveden v komentářích. privatevoid LayoutRoot_MouseRightButtonUp(object sender, MouseButtonEventArgs e) { e.Handled = true; //Nastavíme kontextové menu na viditelné ContextMenu.Visibility = Visibility.Visible; ContextMenu.IsOpen = true; //Nastavíme pozici kontextového menu ContextMenu.Margin = new Thickness(e.GetPosition(LayoutRoot).X, e.GetPosition(LayoutRoot).Y, 0, 0); //V případě levého kliknutí mimo menu, menu zavři LayoutRoot.MouseLeftButtonDown += (s, args) => { ContextMenu.Visibility = Visibility.Collapsed; ContextMenu.IsOpen = false; }; }.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Výsledná aplikace Ukázka #2 Jen pro úplnost zde uvedu kód, který by se postaral o vyvolání kontextového menu uvnitř RichText Boxu. XAML kód: <Gridx:Name="LayoutRoot"Background="White"><RichTextBoxx:Name="rtb"Height="300"Width="300"Background="AliceBlue"MouseRightButtonDown="rtb_MouseRightButtonDown"MouseRightButtonUp="rtb_MouseRightButtonUp"/><Popupx:Name="ContextMenu"Visibility="Collapsed"><BorderCornerRadius="5"BorderBrush="White"BorderThickness="1"Background="Black"><StackPanel><HyperlinkButtonx:Name="Weight"IsEnabled="True"Visibility="Visible"Content="Font Weight"Foreground="White"Click="Weight_Click"/><HyperlinkButtonx:Name="Style"Content="Font Style"Foreground="White"Click="Style_Click"/></StackPanel></Border></Popup></Grid>.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Aplikační kód: privatevoid rtb_MouseRightButtonDown(object sender, MouseButtonEventArgs e) { e.Handled = true; } privatevoid rtb_MouseRightButtonUp(object sender, MouseButtonEventArgs e) { if (rtb.Selection.Text.Length > 0) { e.Handled = true; //Nastavíme kontextové menu na viditelné ContextMenu.Visibility = Visibility.Visible; ContextMenu.IsOpen = true; //Nastavíme pozici kontextového menu ContextMenu.VerticalAlignment = VerticalAlignment.Top; ContextMenu.HorizontalAlignment = HorizontalAlignment.Left; ContextMenu.Margin = new Thickness(e.GetPosition(LayoutRoot).X, e.GetPosition(LayoutRoot).Y, 0, 0); //Vytvoříme canvas, který bude obsluhovat událost kliknutí levého tlačítka Canvas canvas = new Canvas(); canvas.Background = new SolidColorBrush(Colors.Transparent); canvas.MouseLeftButtonDown += (s, args) => { ContextMenu.IsOpen = false; LayoutRoot.Children.Remove(canvas); }; canvas.MouseRightButtonDown += (s, args) => { rtb_MouseRightButtonDown(s, args); ContextMenu.IsOpen = false; LayoutRoot.Children.Remove(canvas); }; LayoutRoot.Children.Add(canvas); } } privatevoid Weight_Click(object sender, RoutedEventArgs e) { if (rtb.Selection.GetPropertyValue(Run.FontWeightProperty) is FontWeight && ((FontWeight)rtb.Selection.GetPropertyValue(Run.FontWeightProperty)) == FontWeights.Normal) rtb.Selection.ApplyPropertyValue(Run.FontWeightProperty, FontWeights.Bold); else rtb.Selection.ApplyPropertyValue(Run.FontWeightProperty, FontWeights.Normal); //Zavři kontextové menu ContextMenu.IsOpen = false; } privatevoid Style_Click(object sender, RoutedEventArgs e) { if (rtb.Selection.GetPropertyValue(Run.FontStyleProperty) is FontStyle && ((FontStyle)rtb.Selection.GetPropertyValue(Run.FontStyleProperty)) == FontStyles.Normal) rtb.Selection.ApplyPropertyValue(Run.FontStyleProperty, FontStyles.Italic); else rtb.Selection.ApplyPropertyValue(Run.FontStyleProperty, FontStyles.Normal); //Zavři kontextové menu ContextMenu.IsOpen = false; }.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Pokud v aplikaci nemáme vybranou žádnou část textu, pak se kontextové menu nezobrazí. V kontextovém menu máme možnost změnit tloušťku(weight) a styl(style) písma. Zajímavou věcí na tomto kódu je vytvoření canvasu, který je transparentní. Tento canvas je tam z toho důvodu, že RichText box obsluhuje událost levého tlačítka myši. Nejjednodušší způsob jak reagovat na stisk levého tlačítka uvnitř RichText boxu je vytvoření canvasu, který bude implementovat událost stisku levého tlačítka. Při zavření kontextového menu se i canvas zruší. Výsledná aplikace Shrnutí Podpora pravého tlačítka myši v rámci událostí MouseRightButtonDown a MouseRightButtonUp Nutné nastavit vlastnost Handled na true v události MouseRightButtonDown V metodě MouseRightButtonUp voláme vlastní kontextové menu K tvorbě kontextového menu lze použít komponentu Popup, ze Silverlight Toolkitu hotovou komponentu ContextMenu apod. Lze použít na všechny elementy typu UIElements Wed, 05 May 2024 00:00:00 +0200 9fcfde80-a0d3-447a-b389-a0f296059747 http://aglight.cz/Silverlight/Detail/15 David Beinhauer Silverligth 4 - Notification API [Sledujte také náš twitter @Aglightcz, kde naleznete krátké zprávy nejen o novinkách na našem webu] Oznámení, že přišel nový email. Upozornění, že virová databáze je zastaralá nebo že je na serveru dostupná nová verze aplikace. Právě při těchto událostech se můžeme setkat s tzv. notifikací, která obvykle na nás vyskakuje z pravého dolního rohu obrazovky. V rámci nové verze Silverlightu můžeme tento mechanismus využít i v naších aplikacích. Příklad notifikace: Třída, která zajišťuje vytváření notifikačních oken, se nacházi ve jmenném prostoru System.Windows. Velikost okna se nastavuje přes vlastnosti Width(šířka) a Height(výška). Pro zobrazení okna se používá metoda Show(int), která jako parametr přijímá dobu, po kterou bude notifikační okno zobrazeno. Omezení Prvním omezením je, že notifikační okno vyvoláte pouze v režimu mimo prohlížeč(Out of the browser - OOB). Uživatel tedy musí mít nainstalovanou aplikaci na svém PC. Není možné vyvolat notifikaci v rámci prohlížeče. Maximální možná velikost notifikačního okna je 100px pro výšku a 400px pro šířku. V případě nedodržení těchto rozměrů se může stát, že se nám okno nezobrazí. Dále je nutné počítat s tím, že v rámci notifikačního okna nemůžeme pracovat s událostmi vyvolané klávesnicí. Ve své podstatě by mělo být notifikační okno určené pouze pro čtení (Read-Only). Ukázka Následující aplikace bude mít jedno tlačítko, které po kliknutí vyvolá notifikační okno s nějakým oznámením. Vytvořme si novou aplikaci a do ní jedno tlačítko. K tlačítku přidejme událost kliknutí(Click). Velice jednoduše například: <Gridx:Name="LayoutRoot"Background="White"><ButtonContent="Notify"Height="23"HorizontalAlignment="Left"Margin="12,12,0,0"Name="button1"VerticalAlignment="Top"Width="75"Click="button1_Click"/></Grid> Nyní se přepneme do kódu v pozadí (Code behind) a najdeme si metodu, která je vyvolána po kliknutí na tlačítko. V mém případě se jedná o metodu button1_Click. Do této metody přidejme novou instanci notifikačního okna: NotificationWindow notify = new NotificationWindow(); Nyní je třeba nastavit rozměry notifikačního okna. Ty se nastavují přes vlastnosti Width(šířka) a Height(výška). Jednotky jsou v pixelech. notify.Width = 400; notify.Height = 80;.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Následně vyplníme okno nějakým obsahem. My si vystačíme pouze s textem. Pro tento účel zvolíme třídu TextBlock s textem “Notifikace”: TextBlock tb = new TextBlock(); tb.Text = "Notifikace";notify.Content = tb;.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Vlastnost Content je typu FrameworkElement, takže obsah notifikačního okna může být graficky bohatý. Nakonec toto okno zobrazíme přes metodu Show, která jako parametr přijímá časovou hodnotu. Pomocí této hodnoty, která je určena v milisekundách, oznamujeme, jak dlouho má být notifikační okno viditelné. notify.Show(3000); Z uvedeného fragmentu se okno zobrazí po dobu 3s. Celý kód metody reagující na kliknutí tlačítka: privatevoid button1_Click(object sender, RoutedEventArgs e) { NotificationWindow notify = new NotificationWindow(); notify.Width = 400; notify.Height = 80; TextBlock tb = new TextBlock(); tb.Text = "Notifikace"; notify.Content = tb; notify.Show(3000); } V poslední řadě je důležité zapnout možnost instalace aplikace na klientský počítač (OOB). Ten jednoduše nastavíme přes vlastnosti projektu a zaškrtnutím možnosti instalace na klientské PC (Enable running application out of the browser). Spustíme aplikaci, nainstalujeme aplikaci na klientský počítač a následně klikneme na tlačítko. Mělo by se nám zobrazit notifikační okno podobné tomu na obrázku: .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Shrnutí Vyvolání notifikačního okna pouze v režimu OOB Maximální výška okna je 100px a maximální šířka okna je 400px Metoda Show() slouží pro zobrazení notifikačního okna, jako parametr přijímá dobu, po kterou bude okno zobrazeno Vlastnost Content je typu FrameworkElement Nelze obsluhovat události vyvolané klávesnicí Sat, 01 May 2024 00:00:00 +0200 5123e33f-124c-4f03-9e67-8bfca866eedf http://aglight.cz/Silverlight/Detail/10 David Beinhauer Silverlight 4 - Clipboard API [Sledujte také náš twitter @Aglightcz, kde naleznete krátké zprávy nejen o novinkách na našem webu] Třída, která zajišťuje přístup ke schránce, se nachází ve jmenném prostoru System.Windows.Clipboard. Ta zpřístupňuje 3 statické metody. GetText – metoda získá text ze schránky SetText - metoda vloží text do schránky ContainsText - metoda zjistí, zda-li schránka má nějaký obsah Omezení Pouze text (Unicode) můžeme získávat nebo vkládat do schránky. To je docela zásadní rozdíl oproti technologii WPF, kde bylo možné také pracovat například s obrázky. Metody SetText a GetText můžeme vyvolat pouze v rámci uživatelovi interaktivity. Tedy v rámci události Click nebo Keydown. Každý jiný způsob přístupu ke schránce je ukončen výjimkou (SecurityException). Běží-li aplikace v prohlížeči nebo je nainstalovaná na klientském počítači a nemá zapnutou zvýšenou důvěru (Elevated Trust), pak se uživateli objeví dialog s informací o přístupu do schránky. Uživatel má možnost přístup povolit nebo naopak zakázat. Při zákazu je vyvolána výjimka (SecurityException). Tento dialog se zobrazí pouze jednou za relaci (session). Ukázka V naší ukázce budeme mít dvě komponenty typu RichTextBox a dvě tlačítka. První RichTextBox bude sloužit jako zdroj pro kopírování a druhý bude zobrazovat obsah schránky. XAML kód aplikace může vypadat například takto: <Gridx:Name="LayoutRoot"Background="White"><RichTextBoxHorizontalAlignment="Left"Name="richTextBox1"VerticalAlignment="Top"Width="190"Height="213"Margin="6,0,0,0"/><RichTextBoxHorizontalAlignment="Left"Margin="203,0,0,0"Name="richTextBox2"VerticalAlignment="Top"Height="213"Width="190"IsReadOnly="True"/><ButtonContent="Kopíruj"Height="23"HorizontalAlignment="Left"Margin="60,219,0,0"Name="button1"VerticalAlignment="Top"Width="75"Click="button1_Click"/><ButtonContent="Vlož"Height="23"HorizontalAlignment="Left"Margin="255,219,0,0"Name="button2"VerticalAlignment="Top"Width="75"Click="button2_Click"/></Grid>.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Vytvořili jsme si dva RichTextBoxy a dvě tlačítka pomocí kterých budeme kopírovat resp. vkládat text ze schránky. Do metody pro kopírování(button1_Click) vložíme následující kód: if (richTextBox1.Selection.Text.Length > 0) { Clipboard.SetText(richTextBox1.Selection.Text); } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Prvně otestujeme zda-li v prvním RichTextBoxu máme vybraný nějaký text. Pokud ano, tak přes statickou metodu SetText() tento text přidáme do schránky. Do metody pro vložení textu ze schránky(button2_Click) přidáme následující kód: if (Clipboard.ContainsText()) richTextBox2.Selection.Text = Clipboard.GetText();.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } V případě, že se ve schránce nachází nějaký text (Clipboard.ContainsText()), pak tento text vložíme ze schránky (Clipboard.GetText()) na označené místo v druhém RichTextBoxu. Výsledná aplikace Do levého RichTextBoxu napíšeme nějaký text. Poté text, který chceme vložit do schránky, označíme a klikneme na tlačítko Kopírovat. Pomocí tlačítka vložit, pak vložíme text ze schránky do pravého RichTextBoxu. .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Shrnutí Statická třída System.Windows.Clipboard Tři statické metody - GetText, SetText, ContainsText Pracuje se pouze s textem Volání GetText a SetText pouze v rámci uživatelovi interaktivity Aplikace v prohlížeči nebo v OOB bez zvýšené důvěry požaduje souhlas uživatele k přístupu do schránky Fri, 30 Apr 2024 00:00:00 +0200 e9c46058-2655-4500-a573-c38ab75cdc64 http://aglight.cz/Silverlight/Detail/16 David Beinhauer Jak zjistit verzi Silverlightu přes JavaScript? [Sledujte také náš twitter @Aglightcz, kde naleznete krátké zprávy nejen o novinkách na našem webu] Zjistit verzi Silverlightu v prohlížeči není úplně tak snadné, jak by se na první pohled mohlo zdát. Jedinou možností je použití JavaScriptu . Silverlight.js, což je standardní JavaScript pro Silverlight, takovou možnost ale nenabízí. V rámci Silverlight.js je možné zjistit existenci pluginu (isInstalled). Tím to bohužel končí. Existují určité způsoby, jak relativně detekovat hlavní releasy Silverlightu, například zde: http://bit.ly/awYhvm Gergely Orosz vytvořil podstatně zajímavější způsob detekce verze s využitím JavaScriptu. JavaScriptový soubor a vysvětlení kódu najdete na adrese: http://bit.ly/d9m5bN Z kódu je patrné, že detekce verze Silverlightu je podstatně jednodušší v jiných prohlížečích než je tomu v Internet Exploreru. Fri, 30 Apr 2024 00:00:00 +0200 e77a29fb-7b3a-4053-9939-346afe0e3870 http://aglight.cz/Silverlight/Detail/13 David Beinhauer Silverlight 4 - WebBrowser komponenta [Sledujte také náš twitter @Aglightcz, kde naleznete krátké zprávy nejen o novinkách na našem webu] WebBrowser je nová komponenta, která umožňuje renderovat HTML uvnitř silverlightí aplikace. Dokáže se vypořádat i s vnořenou aplikací v Silverlightu, ve Flashi a jiné. Nachází se ve jmenném prostoru System.Windows.Controls. Zpřístupnit obsah webové stránky můžeme třemi různými způsoby: Metoda NavigateToString(String), která jako parametr přijímá kód webové stránky(HTML + JavaScript) Metoda Navigate(URI), která jako parametr přijímá URI Vlastnost Source, které jako hodnotu přiřadíme URI Druhý a třetí způsob je ekvivalentní. Další zajímavou metodou je metoda InvokeScript(String), která umožňuje zavolat skript, jehož jméno je předáno v parametru. Omezení Pouze aplikace v režimu mimo prohlížeč(Out of the Browser - OOB) je schopná renderovat obsah webové stránky. Pokud se pokusíme zpřístupnit obsah webové stránky v rámci prohlížeče, tak se nám objeví prázdný čtverec stejné velikosti jako je vložená WebBrowser komponenta. Je tedy vhodné kontrolovat, zda-li aplikace je spuštěna mimo prohlížeč. Například s použitím podmínky: if (App.Current.IsRunningOutOfBrowser).csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Ukázka Vytvořme si aplikaci, která bude obsahovat WebBrowser komponentu pro zobrazení obsahu webové stránky, textové pole pro zadání webové adresy a v poslední řadě tlačítko, které vyvolá přechod na webovou stránku. Aplikace by mohla vypadat podobně jako na obrázku: XAML kód může vypadat následovně: <Gridx:Name="LayoutRoot"Background="#FFA7A7A7"><WebBrowserHeight="440"Name="webBrowser1"VerticalAlignment="Top"Margin="12,53,0,0"HorizontalAlignment="Left"Width="552"/><TextBoxHeight="23"Width="338"Margin="12,15,412,0"Name="textBox1"VerticalAlignment="Top"HorizontalAlignment="Left"/><ButtonContent="-->"Height="23"HorizontalAlignment="Left"Margin="489,15,0,0"Name="button1"VerticalAlignment="Top"Width="75"Click="button1_Click"/></Grid> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Nyní přidáme událost kliknutí na tlačítko (v designéru dvakrát poklepat na tlačítko) Do této metody přidáme následující kód: if (App.Current.IsRunningOutOfBrowser) { webBrowser1.Source = new Uri(textBox1.Text, UriKind.Absolute); } else { MessageBox.Show("Pro prohlížení webové stránky je nutné mít aplikaci v režimu OOB."); }.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Po kliknutí na tlačítko otestujeme zda-li je aplikace v režimu OOB. V případě, že aplikace běží mimo webový prohlížeč, pak po kliknutí se ve WebBrowseru vyrenderuje obsah zadané stránky. Do vlastnosti Source je předán nový objekt typu Uri, kterému je předán text z textového pole jako adresa webové stránky. Místo vlastnosti Source jsme mohli použít metodu Navigate(Uri). Oba způsoby jsou totožné. Nyní nahraďme vlastnost Source metodou NavigateToString(): webBrowser1.NavigateToString(textBox1.Text); Do textového pole napišme nějaký fragment HTML kódu, WebBrowser by nám tento kód měl správně vyrenderovat. Například: .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Shrnutí WebBrowser pracuje pouze v režimu OOB Nutné nastavit rozměry WebBrowser komponenty, defaultně jsou 0 Metoda Navigate(Uri) a vlastnost Source zobrazí obsah zadané webové stránky Metoda NavigateToString(String) příjímá kód HTML a Javascript, který následně zobrazí Metoda InvokeScript(String) vyvolá zadaný skript Fri, 30 Apr 2024 00:00:00 +0200