29/09/20161 Dialogová okna (1) Dialogová okna mohou být ve WPF (podobně jako ve Windows Forms) implementována jako: –modální: zobrazení se provede voláním metody ShowDialog metoda ShowDialog vrací hodnotu bool?, na zákla- dě které lze určit, jak bylo dialogové okno ukončeno vrácená hodnota metodou ShowDialog je dána nasta- vením vlastnosti DialogResult (typicky v obslužné metodě reagující na stisk tlačítka OK, resp. Storno) –nemodální: zobrazení se provede voláním metody Show
29/09/20162 Dialogová okna (2) Výměnu dat mezi dialogovým oknem a zbýva- jící částí aplikace lze realizovat pomocí: –veřejných vlastností definovaných ve třídě zapou- zdřující dané dialogové okno –datových vazeb (data binding) Tlačítko: –OK: by mělo mít nastavenu vlastnost IsDefault na hod- notu true, aby bylo možné dialog ukončit stiskem klávesy Enter stisk tlačítka OK automaticky neuzavírá dialog, je nutné provést volání metody Close
29/09/20163 Dialogová okna (3) –Strono: by mělo mít nastavenu vlastnost IsCancel na hod- notu true, aby bylo možné dialog ukončit stiskem klávesy Esc je-li IsCancel nastavena na true, pak při stisku tlačítka Storno dojde automaticky k uzavření dialogu Dialogové okno by: –nemělo být viditelné na liště spuštěných aplikací (taskbar) vlastnost ShowInTaskbar nastavit na hodnotu false –většinou nemělo umožňovat zvětšování a zmen- šování vlastnost ResizeMode nastavit na hodnotu NoResize
29/09/20164 Dialogová okna (4) –mělo mít nastaveného svého vlastníka (např. hlav- ní okno aplikace) pomocí vlastnosti Owner –většinou mělo být centrované vzhledem ke svému vlastníku vlastnost WindowStartupLoca- tion nastavit na hodnotu CenterOwner –mělo mít vhodným způsobem nastavené vstupní zaměření (lze realizovat voláním metody Focus u příslušného ovládacího prvku)
29/09/20165 Stromy elementů (1) Stromy elementů (element trees) uspořádávají množiny elementů do hierarchické struktury WPF rozlišuje dva typy stromů elementů: –logický strom (logical tree) –vizuální strom (visual tree) Logický strom: –reprezentuje strukturu prvků uživatelského rozhra- ní definovaných v jazyce XAML nebo v kódu na pozadí –příklad (jako rozložení je použitý StackPanel):
29/09/ Stromy elementů (2) Window StackPanel ButtonListBox String
29/09/20167 Stromy elementů (3) Vizuální strom: –zahrnuje všechny elementy, které jsou ve finální fázi vykresleny na zobrazovacím zařízení –obsahuje všechny elementy logického stromu, kte- ré jsou odvozeny od tříd Visual a Visual3D –rozděluje jednotlivé elementy na menší části, které tvoří výsledný vzhled grafického prvku –využívá se například pro přizpůsobení vzhledu prvků (stylování) uživatelského rozhraní –ve Visual Studiu jej lze zobrazit pomocí okna Live Visual Tree
29/09/20168 Stromy elementů (4)
29/09/20169 Závislé vlastnosti (1) Závislé vlastnosti (dependency properties) představují rozšíření možností doposud použí- vaných CLR vlastností Umožňují např.: –dědičnost hodnot (property value inheritance): hodnota závislé vlastnosti může být zděděna od nadřa- zeného elementu (nejedná se o dědičnost ve smyslu OOP) např.: font použitý u tlačítka může být zděděn od hlav- ního okna (tlačítko převezme font, jenž je nastavený na úrovni hlavního okna)
29/09/ Závislé vlastnosti (2) –oznámení o změně hodnoty (change notification): lze definovat metodu, která se automaticky vyvolá v okamžiku, kdy dojde ke změně hodnoty vlastnosti dovoluje použití tzv. property triggers: –umožňují při změně hodnoty provést akci bez nutnosti psát procedurální kód –ověřovat platnost zapisované hodnoty (data valida- tion): dovoluje popsat metodu, která ověří platnost zapisované hodnoty –provést „vynucenou“ úpravu zapisované hodnoty (value coercion): zapisovaná hodnota může být automaticky modifiková- na (upravena) tak, aby byla konzistentní s hodnotami jiných vlastností
29/09/ Závislé vlastnosti (3) např.: –zabezpečení, že horní mez rolovací lišty nebude menší než její dolní mez –horní mez bude „vynuceně“ nastavena na hodnotu dolní meze –datové vazby (data binding): technika umožňující nastavit propojení mezi uživatel- ským rozhraním aplikace a její aplikační logikou –použití stylů: styly představují elementy definující vzhled ovládacího prvku –použití šablon: elementy popisující celkovou strukturu ovládacího prvku –použití animací: změny hodnoty ve specifikovaném časovém intervalu
29/09/ Závislé vlastnosti (4) Závislé vlastnosti nejsou součásti CLR, ale jsou implementovány až rozhraním WPF: –nemají v jazyce C# přímou syntaktickou podporu –každou závislou vlastnost je nutné v rámci WPF registrovat Třída, která chce definovat závislé vlastnosti musí být odvozena (přímo nebo nepřímo) od třídy DependecyObject Definice se provádí pomocí veřejné statické datové položky, která je: –určena pouze pro čtení (modifikátor readonly ) –typu DependencyProperty
29/09/ Závislé vlastnosti (5) Registrace závislé vlastnosti se provádí volá- ním metody Register (třídy Dependen- cyProperty ) Registraci je možné provést: –v době definice datové položky –ve statickém konstruktoru třídy, jež tuto vlastnost definuje V době registrace lze specifikovat: –jméno (závislé vlastnosti) –datový typ (pomocí klíčového slova typeof ) –vlastníka – třídu (pomocí typeof ) –metadata –odkaz na funkci (callback) pro ověření platnosti
29/09/ Závislé vlastnosti (6) Metadata jsou definována pomocí instance třídy FrameworkPropertyMetadata Na úrovni metadat lze specifikovat např.: –implicitní hodnotu –funkci (callback), která bude vyvolána: pro úpravu hodnoty (value coercion) při změně hodnoty –příznaky, které zapínají/vypínají další rysy, např.: zda při změně hodnoty má být znovu proveden proces měření, uspořádání apod. zda při změně hodnoty má dojít k překreslení dědičnost hodnot zákaz použití pro animace nebo datové vazby
29/09/ Závislé vlastnosti (7) Hodnoty závislých vlastností lze zpřístupňovat pomocí volání metody: –GetValue : pro čtení –SetValue : pro zápis Ke každé závislé vlastnosti bývá zvykem nap- sat obal (wrapper), který umožní s touto vlast- ností pracovat syntakticky stejně jako s vlast- ností CLR Konvence: –jméno závislé vlastnosti (datové položky, jíž je re- prezentována) vždy končí slovem Property –jméno obalu je až závěrečné slovo Property stejné jako u odpovídající datové položky
29/09/ Závislé vlastnosti (8) Přístup k závislým vlastnostem pomocí jazyka XAML je překládán na přímé volání metod GetValue a SetValue (nikoliv na volání přístupových metod obalu get a set ) Podobně i jiné části kódu mohou k závislé vlastnosti přistupovat přímo Z toho vyplývá: –přístupové metody obalu závislé vlastnosti by mě- ly používat pouze volání metod GetValue, resp. SetValue –v přístupových metodách by neměla být popsána žádná další aplikační logika
29/09/ Závislé vlastnosti (9) Při čtení hodnoty závislé vlastnosti se uplatňu- je následující postup: –určení základní hodnoty závislé vlastnosti: lokálně nastavená hodnota (hodnota nastavená přímo při práci s objektem v kódu na pozadí nebo v jazyce XAML) hodnota nastavená pomocí stylů a šablon (a jejich spouští – triggers) zděděná hodnota implicitní hodnota –modifikace základní hodnoty: je-li základní hodnota výraz (typu Expression ), tak dojde k jeho vyhodnocení (používáno při práci s dyna- mickými zdroji a datovými vazbami)
29/09/ Závislé vlastnosti (10) je-li závislá vlastnost použita v souvislosti s animací, tak se aplikuje požadovaná animace dojde k vyvolání metody pro úpravu hodnoty – value coercion (je-li definována) provede se metoda pro ověření platnosti – validation (je-li definována) Poznámka: –závislé vlastnosti mohou být sdíleny (tzv. shared de- pendency properties) mezi třídami i v případě, že ty- to třídy nejsou ve vztahu předchůdce-následník –existující závislou vlastnost lze použít jako sdílenou voláním metody AddOwner ve statickém konstruk- toru jiné třídy, jež chce tuto vlastnost využívat
29/09/ Závislé vlastnosti (11) Jako závislé vlastnosti jsou implementovány také přidružené vlastnosti (attached properties) Definice (registrace v rámci WPF) přidružené vlastnosti se provádí pomocí volání metody RegisterAttached Přidružené vlastnosti mohou být použity u li- bovolného objektu (vytvořeného na základě třídy DependencyObject nebo jejího po- tomka) nezapisuje se k nim obal (wrapper) pomocí vlastnosti CLR
29/09/ Závislé vlastnosti (12) Místo obalu se zapisuje dvojice metod: –GetJménoVlastnosti : pro čtení hodnoty –SetJménoVlastnosti : pro zápis hodnoty Tyto metody pro vlastní zpřístupnění hodnoty rovněž používají volání metod GetValue, resp. SetValue
29/09/ Směrované události (1) Směrované události (routed events) jsou rozší- řením doposud používaných.NET událostí Model směrovaných událostí je podobný mo- delu závislých vlastností: –jsou implementovány až rozhraním WPF (nikoliv na úrovni CLR) –mohou být definovány ve třídách odvozených ze třídy UIElement –každá směrovaná událost musí být nejprve regis- trována –jsou reprezentovány veřejnými statickými datový- mi položkami typu RoutedEvent určenými pou- ze pro čtení
29/09/ Směrované události (2) Rozlišují se tři typy směrovaných událostí: –přímá událost (direct event): podobná klasické události vzniká u jednoho elementu a nepostupuje k žádnému jinému elementu např. MouseEnter –bublající událost (bubbling event): postupují směrem nahoru vizuálním stromem elementů např.: MouseDown : –vzniká u elementu, nad nímž bylo stisknuto tlačítko myši (např. ListBox ) –postupuje k jeho rodičovskému elementu (např. Grid ) –postup pokračuje dále, dokud nedorazí ke kořenovému ele- mentu (např. Window )
29/09/ Směrované události (3) postup události může být ukončen nastavením vlastnosti Handled třídy RoutedEventArgs, jejíž objekt (ne- bo objekt jejího potomka) se předává obslužné metodě, na hodnotu true –tunelující událost (tunneling event): postupují stromem elementů směrem dolů mívají označení začínající slovem Preview např. PreviewKeyDown umožňuje zachytit stisk klá- vesy: –nejprve na úrovni okna –následně na specifičtějších kontejnerech –nakonec na elementu, který měl vstupní zaměření (focus) postup tunelující události může být rovněž ukončen nastavením vlastnosti Handled na hodnotu true
29/09/ Směrované události (4) Registrace směrované události se provádí: –v době definice datové položky nebo ve statickém konstruktoru třídy, jež směrovanou událost imple- mentuje –pomocí metody RegisterRoutedEvent třídy EventManager V době registrace lze uvést: –jméno (směrované události) –typ (strategii – přímá, bublající, tunelující) –delegáta definující signaturu obslužné metody (pomocí typeof ) –vlastníka – třídu (pomocí typeof )
29/09/ Směrované události (5) Směrované události bývají obvykle obaleny standardními.NET událostmi Tento obal (wrapper) využívá přístupové me- tody (standardní konstrukce jazyka C#): –add : pomocí metody AddHandler (třídy UIElement ) přidává odkaz na obslužnou metodu –remove : pomocí metody RemoveHandler ( UIElement ) odebírá odkaz na obslužnou metodu Přístupové metody ( add a remove ) by nemě- ly obsahovat žádnou další aplikační logiku
29/09/ Směrované události (6) Konvence: –datové položky reprezentující směrované události bývá zvykem ukončovat slovem Event –jméno obalu je až závěrečné slovo Event stejné jako u odpovídající datové položky Poznámka: –podobně jako závislé vlastnosti mohou být i smě- rované události sdílené mezi třídami (pomocí me- tody AddOwner ), popř. připojené (attached)
29/09/ Zdroje Zdroje (resources) ve WPF se dělí do dvou skupin: –binární: zdroje využívané programem, které nebyly vytvořeny zdrojovým kódem programu (např. obrázky, ikony, zvukové záznamu apod.) –logické (objektové, XAML): objekty, které jsou uloženy ve slovníku a mohou být použity na různých místech programu dělí se (je možné se na ně odkazovat jako) na: –statické: odkaz na ně se do vlastnosti přiřadí pouze jedenkrát (při prvním načtení ze slovníku), pokud dojde ke změně ve slovníku, tak už tato změna neovlivní hodnotu vlastnosti –dynamické: změna hodnoty zdroje se promítne i do vlastnosti, jež se na ni odkazuje
29/09/ Binární zdroje (1) Neprogramové části aplikace jako jsou např. –obrázky, ikony –audio záznamy –video záznamy Lze je rozdělit na: –zdroje, které jsou připojeny k výsledné sestavě (assembly) – soubory, které zůstávají samostatně: známé v době překladu programu neznámé v době překladu (dynamicky generované) Binární zdroje se přidávají k projektu pomocí Solution Exploreru
29/09/ Binární zdroje (2) Obsahují vlastnost Built Action, kterou lze nastavit na hodnotu: –Resource : zdroj bude součástí sestavy (bude k ní připojen) –Content : zdroj zůstane jako samostatný soubor a v sestavě se ulo- ží pouze odkaz na něj bývá nutné ještě nastavit vlastnost Copy to Output Directory na hodnotu Copy always nebo Copy if newer Zpřístupnění binárního zdroje v jazyku XAML se provádí zápisem URI (Uniform Resource Indentifier)
29/09/ Binární zdroje (3) Příklad: Pro zpřístupnění binárních zdrojů v kódu na pozadí je nutné URI specifikovat pomocí třídy Uri Poznámka: –jazyk XAML se překládá do jazyka BAML, jenž je k programu připojen jako binární zdroj