Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Redaktor prowadzący: Michał Mrowiec Projekt okładki: Jan Paluch Fotografia na okładce została wykorzystana za zgodą Shutterstock.com Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie?twnoap Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Kody źródłowe wybranych przykładów dostępne są pod adresem: ftp://ftp.helion.pl/przyklady/twnoap.zip ISBN: 978-83-246-3500-9 Copyright Helion 2012 Printed in Poland. Kup książkę Poleć książkę Oceń książkę Księgarnia internetowa Lubię to!» Nasza społeczność
Spis tre ci Podzi kowania... 11 Od autora... 13 Wst p... 15 Wymagane oprogramowanie... 15 Kody ród owe... 16 U yte oprogramowanie... 16 Organizacja podr cznika... 16 Rozdzia 1. Wprowadzenie do WPF... 19 1.1. Rozwój interfejsu u ytkownika... 19 1.2. Cechy charakteryzuj ce WPF... 20 1.3. Wersje WPF... 22 1.3.1. WPF 3.5... 23 1.3.2. WPF 4... 23 Rozdzia 2. XAML... 25 2.1. Wiadomo ci podstawowe... 26 2.2. XAML a XML... 28 2.2.1. Znaki specjalne XAML... 29 2.3. Tagi i atrybuty a klasy, w a ciwo ci i zdarzenia... 30 2.4. Przestrzenie nazw... 31 2.4.1. U ywanie typów z innych przestrzeni nazw... 34 2.5. Sposoby okre lania warto ci w a ciwo ci... 35 2.6. Konwertery typów... 37 2.7. Rozszerzenia znaczników... 37 2.8. Elementy zagnie d one... 41 2.8.1. Element typu content... 42 2.8.2. Kolekcje... 43 2.8.3. Warto, która mo e by przekonwertowana na obiekt... 45 2.9. XAML i kod proceduralny... 45 2.9.1. Kod proceduralny i nieskompilowany XAML... 46 2.9.2. Kod proceduralny i skompilowany XAML... 46 2.10. XAML 2009... 49 2.11. S owa kluczowe XAML... 49 Pytania testowe... 52 Odpowiedzi na pytania... 55
6 Tworzenie nowoczesnych aplikacji graficznych w WPF Rozdzia 3. Podstawy WPF... 57 3.1. Architektura systemu... 57 3.2. Hierarchia klas... 59 3.3. Drzewa logiczne i drzewa prezentacji... 61 3.3.1. Drzewa logiczne... 61 3.3.2. Drzewa prezentacji... 64 3.4. W a ciwo ci zale ne... 68 3.4.1. Implementacja w a ciwo ci zale nych... 69 3.4.2. Powiadamianie o zmianie, wyzwalacze w a ciwo ci... 72 3.4.3. Dziedziczenie warto ci w a ciwo ci... 74 3.4.4. Ostateczna warto w a ciwo ci... 77 3.4.5. W a ciwo ci do czone... 78 Pytania testowe... 80 Odpowiedzi do pyta... 81 Rozdzia 4. Zarz dzanie uk adem graficznym wewn trz paneli... 83 4.1. Czym jest uk ad elementów... 84 4.2. Sterowanie rozmiarem... 85 4.2.1. Height i Width... 85 4.2.2. Margin i Padding... 86 4.2.3. Visibility... 88 4.3. Sterowanie pozycj... 89 4.3.1. HorizontalAlignment i VerticalAlignment... 89 4.3.2. HorizontalContentAlignment i VerticalConentAlignment... 90 4.3.3. FlowDirection... 90 4.3.4. Transformacje... 91 Pytania testowe... 96 Odpowiedzi do pyta... 98 Rozdzia 5. Panele... 99 5.1. Przegl d i klasyfikacja paneli... 99 5.2. Panele interfejsu u ytkownika... 101 5.2.1. Canvas... 102 5.2.2. StackPanel... 104 5.2.3. WrapPanel... 105 5.2.4. DockPanel... 107 5.2.5. Grid... 109 5.3. Tworzenie w asnych paneli... 118 5.3.1. Implementacja pomiarów... 119 5.3.2. Implementacja aran acji... 120 5.3.3. Tworzenie bezu ytecznego i u ytecznego panelu... 121 5.3.4. Tworzenie panelu ko owego... 125 5.4. Pozosta e panele... 132 5.4.1. TabPanel... 132 5.4.2. ToolBarOverflowPanel... 132 5.4.3. UniformGrid... 133 5.4.4. VirtualizingStackPanel... 133 5.4.5. SelectiveScrollingGrid... 134 5.5. Mo liwo ci obs ugi przepe nienia zawarto ci... 134 5.5.1. Przycinanie... 134 5.5.2. Przewijanie... 135 5.5.3. Skalowanie... 136 Pytania testowe... 137 Odpowiedzi do pyta... 141
Spis tre ci 7 Rozdzia 6. Kontrolki... 143 6.1. Podzia kontrolek... 143 6.2. Kontrolki typu Content... 145 6.2.1. Przyciski... 146 6.2.2. Kontrolki informacyjne... 153 6.2.3. Kontenery... 157 6.3. Kontrolki typu Items... 159 6.3.1. Selektory... 159 6.3.2. Kontrolki Menu... 178 6.3.3. Pozosta e kontrolki typu Items... 180 6.4. Kontrolki Ink, tekstowe i inne... 183 6.4.1. Kontrolki zakresu... 183 6.4.2. Kontrolki Ink i tekstowe... 185 6.4.3. Dokumenty... 194 6.4.4. Kontrolki z datami... 201 6.4.5. Kontrolka Image... 205 Pytania testowe... 206 Odpowiedzi do pyta... 211 Rozdzia 7. Struktura i rodzaje aplikacji WPF... 213 7.1. Standardowa aplikacja okienkowa... 213 7.1.1. Klasa Window... 214 7.1.2. Klasa Application... 217 7.1.3. SplashScreen... 221 7.1.4. Okna dialogowe... 221 7.1.5. Zapami tywanie i odczytywanie stanu aplikacji... 226 7.1.6. Okna o niestandardowych kszta tach... 228 7.2. Aplikacje nawigacyjne... 230 7.2.1. Realizacja nawigacji... 231 7.2.2. Przekazywanie danych pomi dzy stronami... 236 7.3. Aplikacje WPF w przegl darce internetowej... 241 7.4. Metody instalacji aplikacji WPF... 243 Pytania testowe... 245 Odpowiedzi do pyta... 247 Rozdzia 8. WPF i Windows 7... 249 8.1. Dostosowywanie paska zada... 249 8.2. Listy szybkiego dost pu... 254 8.2.1. JumpTask... 255 8.2.2. JumpPath... 258 8.3. Aero Glass... 260 Pytania testowe... 264 Odpowiedzi do pyta... 265 Rozdzia 9. Zdarzenia i polecenia... 267 9.1. RoutedEvent... 267 9.1.1. Implementacja zdarze RoutedEvent... 271 9.1.2. Zdarzenia RoutedEvent w praktyce... 275 9.2. Zdarzenia zwi zane z cyklem ycia obiektów... 277 9.3. Zdarzenia wej ciowe... 278 9.3.1. Zdarzenia myszy... 278 9.3.2. Zdarzenia klawiatury... 281 9.3.3. Zdarzenia dotyku i manipulacji... 282
8 Tworzenie nowoczesnych aplikacji graficznych w WPF 9.4. Polecenia... 285 9.4.1. Polecenia wbudowane... 286 9.4.2. Zastosowanie polece w praktyce... 289 Pytania testowe... 292 Odpowiedzi do pyta... 293 Rozdzia 10. Zasoby... 295 10.1. Zasoby binarne... 295 10.1.1. Zasoby binarne w kodzie XAML... 297 10.1.2. Zasoby binarne w kodzie proceduralnym... 299 10.2. Zasoby logiczne... 301 10.2.1. Zasi g zdefiniowanego zasobu... 304 10.2.2. Zasoby statyczne i dynamiczne... 306 10.2.3. Czy wszystko mo e by zasobem?... 308 10.2.4. Zasoby logiczne i kod proceduralny... 310 10.2.5. Krótko o zasobach systemowych... 311 Pytania testowe... 312 Odpowiedzi do pyta... 314 Rozdzia 11. Wi zanie danych... 315 11.1. Podstawy wi zania danych... 316 11.1.1. Definiowanie pierwszego wi zania... 316 11.1.2. Definiowanie wi zania danych w kodzie XAML... 320 11.1.3. Definiowanie wi zania ze zwyk ymi w a ciwo ciami.net... 322 11.1.4. Definiowanie wi zania z ca kolekcj... 326 11.2. Kontrolowanie wy wietlania wi zanych danych... 330 11.2.1. Formatowanie stringu... 331 11.2.2. Szablony danych... 332 11.2.3. Konwertery... 336 11.3. Zarz dzanie kolekcj za pomoc widoku... 341 11.3.1. Sortowanie... 341 11.3.2. Grupowanie... 343 11.3.3. Filtrowanie... 345 11.4. Walidacja danych... 347 11.4.1. Wbudowane mechanizmy walidacji... 348 11.4.2. Definiowanie w asnej walidacji... 353 11.5. Sterowanie przep ywem danych... 354 11.6. Wsparcie dla wielu róde danych... 356 11.6.1. CompositeCollection... 356 11.6.2. MultiBinding... 356 11.6.3. PriorityBinding... 357 Pytania testowe... 357 Odpowiedzi do pyta... 360 Rozdzia 12. Style, szablony, skórki i motywy... 361 12.1. Style... 362 12.1.1. Zarz dzanie wspó dzieleniem stylu... 365 12.2. Wyzwalacze... 369 12.2.1. Property triggers... 370 12.2.2. Data triggers... 371 12.2.3. Warunki logiczne w wyzwalaczach... 375 12.3. Szablon kontrolek ControlTemplates... 377 12.3.1. Zastosowanie wyzwalaczy w szablonach... 382 12.3.2. Zale no od warto ci w a ciwo ci rodziców... 385 12.4. Umieszczanie szablonów kontrolek w stylach... 390
Spis tre ci 9 12.5. Bardziej z o one szablony... 391 12.5.1. Cz ci... 394 12.5.2. Visual State Manager... 398 12.6. Skórki... 404 12.7. Motywy... 409 Pytania testowe... 413 Odpowiedzi do pyta... 417 Rozdzia 13. Grafika 2D... 419 13.1. P dzle klasa Brush... 419 13.1.1. P dzle maluj ce kolorem... 421 13.1.2. P dzle pokrywaj ce... 427 13.1.3. BitmapCacheBrush... 441 13.2. Kszta ty... 445 13.2.1. Ci kie kszta ty klasa Shape... 447 13.2.2. Lekkie kszta ty klasa Geometry... 454 13.3. Klasa Drawing... 464 13.3.1. Klasa Pen... 468 13.3.2. Podsumowanie kszta tów prostych, czyli tworzymy clipart... 469 Pytania testowe... 472 Odpowiedzi do pyta... 477 Rozdzia 14. Grafika 3D... 479 14.1. Pierwsza scena 3D w interfejsie u ytkownika... 480 14.2. Umiejscowienie grafiki 3D w interfejsie u ytkownika... 483 14.3. Uk ad wspó rz dnych w przestrzeni 3D... 484 14.4. Punkt widzenia Camera... 485 14.4.1. Rodzaje kamer... 489 14.5. Transformacje 3D... 492 14.5.1. Translacja... 495 14.5.2. Skalowanie... 496 14.5.3. Obrót... 498 14.5.4. Grupowanie transformacji... 500 14.6. Podstawowy element sceny 3D Model3D... 501 14.6.1. O wietlenie klasa Light... 506 14.6.2. Materia klasa Material... 511 14.6.3. Model3DGroup... 516 14.7. Visual3D... 517 14.7.1. ModelVisual3D... 518 14.7.2. Viewport2DVisual3D... 519 14.7.3. UIElement3D... 521 14.8. Viewport3D... 524 Pytania testowe... 527 Odpowiedzi do pyta... 531 Rozdzia 15. Animacje... 533 15.1. Pierwsza animacja... 534 15.2. Klasy implementuj ce animacje... 537 15.3. W a ciwo ci steruj ce przebiegiem animacji... 540 15.3.1. Duration... 540 15.3.2. From, To, By... 541 15.3.3. BeginTime... 543 15.3.4. AutoReverse... 543 15.3.5. RepeatBehavior... 544 15.3.6. SpeedRatio i przyspieszenie animacji... 545
10 Tworzenie nowoczesnych aplikacji graficznych w WPF 15.4. Umiejscowienie animacji w kodzie XAML... 546 15.4.1. Wyzwalacze EventTrigger... 547 15.4.2. Klasy BeginStoryboard i Storyboard... 548 15.5. Animacje keyframe... 559 15.5.1. Interpolacja liniowa... 561 15.5.2. Interpolacja dyskretna... 563 15.5.3. Interpolacja Spline... 565 15.6. Animacje PathGeometry... 567 15.7. Funkcje u atwiaj ce... 568 Pytania testowe... 570 Odpowiedzi do pyta... 574 Skorowidz... 575
Rozdzia 8. WPF i Windows 7 W tym rozdziale: dostosowywanie paska zada, listy szybkiego dost pu, Aero Glass. Windows 7 posiada nowe funkcje w porównaniu ze swoimi poprzednikami nale do nich na przyk ad listy szybkiego dost pu. WPF w zwi zku z tym posiada API, za pomoc którego mo emy w naszych aplikacjach wykorzystywa te nowe funkcje o tym w a nie b dzie ten rozdzia. Zobaczysz, jak mo na wp ywa na informacje pokazywane w pasku zada, jak w aplikacji WPF mo na manipulowa tym, co jest wy- wietlane w podgl dzie aplikacji, oraz nauczysz si umieszcza zawarto w li cie szybkiego dost pu. Na ko cu rozdzia u porusz kwestie zwi zane z interfejsem Aero Glass zmienimy nasz aplikacj TwitterClient tak, by ca e okno wraz z list wiadomo ci by o przezroczyste. 8.1. Dostosowywanie paska zada Pasek zada w systemie Windows 7 ma troch inny wygl d ni jego poprzednicy, posiada równie pewne nowe funkcje. Zapewne ka dy zauwa y, e w momencie najechania kursorem na pasek zada poszczególne ikony oznaczaj ce aplikacje s kolorowane dominuj c barw. Dodatkowo w przypadku niektórych programów mo na zaobserwowa, e je eli wyst pi b d ich dzia ania, ich ikona w pasku zada staje si czerwona. Jest jeszcze jedna funkcjonalno paska zda, z któr na pewno ka dy mia okazj si spotka je eli pobieramy jakie dane z internetu, ikona przegl darki w pasku zda wskazuje poziom post pu procesu pobierania jest to równie jedna z nowych mo liwo ci manipulacji zachowaniem paska zada. Wszystkie te funkcjonalno ci z wyj tkiem zmiany koloru pod wietlania ikony w pasku zada (w tym przypadku jedyn opcj zmiany koloru pod wietlania aplikacji jest zmiana kolorów ikony) da si zaimplementowa w aplikacji WPF.
250 Tworzenie nowoczesnych aplikacji graficznych w WPF Zacznijmy od tego, co nowego mo emy zaobserwowa w zwi zku z paskiem zada (pomijamy na razie kwestie list szybkiego dost pu omówionych w kolejnych podrozdzia ach). Rysunek 8.1 pokazuje podgl d aplikacji oraz wygl d paska zada wraz z jego poszczególnymi elementami (jako przyk ad w tym rozdziale pos u y nam aplikacja TwitterClient). Rysunek 8.1. Pasek zada wraz z podgl dem programu TwitterClient oraz opisem poszczególnych jego elementów Klas, za pomoc której mo na manipulowa paskiem zada, jest TaskbarItemInfo. Poni szy fragment kodu pokazuje, jak zdefiniowano opis, który widoczny jest na rysunku 8.1 (UserTimeline). <Window.TaskbarItemInfo> <TaskbarItemInfo Description="{Binding ElementName=Window, Path=TimeLine}"/> </Window.TaskbarItemInfo> Opis jest ustawiany przez wpisanie do w a ciwo ci Decription obiektu TaskbarItemInfo odpowiedniego napisu. W powy szym kodzie napis jest zdefiniowany za pomoc wi zania danych z w a ciwo ci TimeLine przechowuj c typ wyliczeniowy zawieraj cy warto ci User Timeline, Home Timeline, Private Timeline, Mentions i Retweete By Me czyli grupy wiadomo ci. Poniewa warto ci tego typu s wpisywane do zmiennej przy ka dej zmianie warto ci w a ciwo ci TimeLine, utworzone wi zanie danych zapewni samoczynne od wie anie opisów. Grupy wiadomo ci to wiadomo ci serwisu Twitter, które s zgrupowane tematycznie, przyk adowo UserTimeLine zawiera tylko wiadomo ci napisane przez nas, HomeTimeLine to wiadomo ci nasze i osób, które ledzimy. W j zyku angielskim nazywane s one time lines. Niestety tej nazwy nie da si poprawnie przet umaczy na j zyk polski jedyne, co przysz o mi do g owy, to w a nie grupy wiadomo ci. Poniewa t umaczenie wydaje mi si niezbyt trafione, a niestety lepszego nie jestem w stanie wymy li (Google te ;)), proponuj stosowanie angielskiego okre lenia time line.
Rozdzia 8. WPF i Windows 7 251 W a ciwo ci zale ne Aby powy sze wi zania zadzia a y, w a ciwo TimeLine nie mo e by zwyk w a ciwo ci, poniewa technika wi zania danych wymaga, aby ród o (w tym przypadku w a ciwo TimeLine) powiadamia o cel wi zania (w a ciwo Description) o zmianie swojej zawarto ci w przeciwnym razie w a ciwo Description przechowywa aby ci gle t sam, wpisan za pierwszym razem warto w a ciwo ci TimeLine. W a ciwo TimeLine, aby mog a powiadamia o swojej zmianie, musia a zosta zdefiniowana jako w a ciwo zale na, co przedstawia poni szy fragment kodu. DependencyProperty.Register("TimeLine", typeof(timelines), typeof(mainwindow)); public TimeLines TimeLine { get { return (TimeLines)GetValue(TimeLineProperty); } set { SetValue(TimeLineProperty, value); } } Zagadnienie w a ciwo ci zale nych omówione jest dok adnie w rozdziale Podstawy WPF. Zagadnienie wi zania danych jest omówione w rozdziale Wi zanie danych, je li wi c zapis w powy szym kodzie nie jest dla Ciebie zrozumia y, nie przejmuj si wystarczy wiedzie, e dzi ki niemu samoczynnie b d si zmienia y podpowiedzi po prze czeniu time line na inny rysunek 8.2 pokazuje opis po zmianie time line na HomeTimeLine. Rysunek 8.2. Zmiana opisu po zmianie time line Zamiast u ywa wi zania danych, mogliby my zdefiniowa warto w nast puj cy sposób: Description="Aplikacja TwitterClient" co spowodowa oby wy wietlenie napisu Aplikacja TwitterClient zamiast napisu widocznego na rysunku 8.2. Nast pn w kolejno ci informacj prezentowan w pasku zada, a pokazan na rysunku 8.1, jest podgl d. W tym przypadku nie mamy du ego wp ywu na to, jak mo e by w nim prezentowana nasza aplikacja jedyna mo liwo manipulacji to ustawienie odpowiednich marginesów tak, by tylko cz okna by a widoczna. Takiego ustawienia dokonuje si za pomoc w a ciwo ci ThumbnailClipMargin typu Thickness, czyli za
252 Tworzenie nowoczesnych aplikacji graficznych w WPF pomoc czterech liczb typu Double okre lamy odst p z ka dej ze stron prostok ta (kolejno od lewej, od góry, od prawej i od do u) przyk ad definicji poni ej. <TaskbarItemInfo ThumbnailClipMargin="5,5,5,480" /> Dzia anie marginesów i jednocze nie powy szego fragmentu kodu pokazuje rysunek 8.3 wida, e tylko górna cz aplikacji jest pokazywana dolna cz stanowi ca 480 jednostek zosta a obci ta. Rysunek 8.3. W wyniku zastosowania w a ciwo ci ThumbnailClip Margin w podgl dzie prezentowana jest tylko cz aplikacji Kolejn z udost pnionych mo liwo ci dostosowywania wygl du paska zada jest umieszczanie w nim przycisków. Realizuje si to przy wykorzystaniu w a ciwo ci ThumbButtonInfos, przechowuj cej kolekcj obiektów ThumbButtonInfo. Wa ne, e nie s to przyciski dziedzicz ce po klasie IUElement. Posiadaj jednak podstawowe funkcjonalno ci przycisków. Niestety (a mo e i na szcz cie ) zawarto ci takiego przycisku mo e by jedynie obrazek nie mo na wi c po prostu wpisa do niego zawarto ci tekstowej, która zostanie zaprezentowana. Sposób definiowania powy szych przycisków przedstawia poni szy fragment kodu. Jego dzia anie mo emy obserwowa na wszystkich powy szych rysunkach. <TaskbarItemInfo > <TaskbarItemInfo.ThumbButtonInfos> <ThumbButtonInfo Description="User Timeline" ImageSource="Images\UGreen.png" Click="user_Click"/> <ThumbButtonInfo Description="Home Timeline" ImageSource="Images\HGreen.png" Click="home_Click"/> <ThumbButtonInfo Description="Public Timeline" ImageSource="Images\PGreen.png" Click="public_Click"/> <ThumbButtonInfo Description="Mentions" ImageSource="Images\MGreen.png" Click="mentions_Click"/> <ThumbButtonInfo Description="Retweeted By Me" ImageSource="Images\RGreen.png" Click="rbm_Click"/> </TaskbarItemInfo.ThumbButtonInfos> </TaskbarItemInfo> Jak widzimy, opisy, które pojawia y si na rysunkach nad przyciskami, zdefiniowane by y za pomoc w a ciwo ci Description. Dla ka dego z przycisków mo na równie definiowa uchwyt dla zdarzenia klikni cia. Pod przyciskami widoczny jest ju tylko sam pasek zada. Tam mamy do dyspozycji dwie mo liwo ci zmiany jego wygl du zdefiniowanie nak adki dla ikony aplikacji w pasku oraz wskazanie stanu i post pu danego procesu.
Rozdzia 8. WPF i Windows 7 253 Element TaskbarItemInfo oferuje dodatkowe mo liwo ci informowania u ytkownika o stanie aplikacji i wykonania operacji, odpowiednio za pomoc w a ciwo ci Progress Value i ProgressState. ProgressValue jest w a ciwo ci typu Double przyjmuj c warto ci od 0 do 1 oznaczaj ce procent wykonania czynno ci. Na wszystkich dotychczasowych rysunkach w a ciwo ta by a ustawiona na warto 1, co oznacza o 100% wykonania danego procesu. Druga w a ciwo ProgressState mo e przyjmowa nast puj ce warto ci 1 : Error oznacza b d, charakteryzuje si czerwonym wype nieniem dooko a ikony aplikacji; Normal stan normalny zielone wype nienie dooko a ikony aplikacji; Paused pauza pomara czowe wype nienie dooko a ikony aplikacji; Indeterminate nieokre lony stosowany w przypadku monitorowania procesu, o którego zaawansowaniu nie mamy adnych informacji prezentowany jest w postaci zielonego paska, który jest animowany w kierunku od lewej do prawej; None domy lna warto, stan post pu wykonania czynno ci nie jest prezentowany w pasku zada. Za jej pomoc mo emy informowa u ytkownika o tym, w jakim stanie znajduje si w danym momencie aplikacja. Na wszystkich powy szych rysunkach mogli my zobaczy nast puj ce ustawienia powy szych w a ciwo ci: <TaskbarItemInfo ProgressState="Normal" ProgressValue="1" /> Rysunek 8.4 prezentuje natomiast wygl d aplikacji TwitterClient w pasku zada w zale no ci od ró nych warto ci w a ciwo ci ProgressState oraz ProgressValue równej 0.75. Rysunek 8.4. Wygl d paska zada aplikacji TwitterClient dla w a ciwo ci ProgressValue = 0.75 oraz ró nych warto ci w a ciwo ci ProgressState 1 Ibidem, s. 246. Na koniec zosta y nam nak adki. Nak adka równie by a widoczna na ka dym z poprzednich obrazków jest to ma y obrazek prezentowany w pasku zada w prawym dolnym rogu obok ikony aplikacji. Dzia a tylko wtedy, gdy pasek zada pokazuje du e ikony. Nak adki stosowane s do przekazywania dodatkowych informacji u ytkownikowi. Na powy szych przyk adach widoczne by y naprzemiennie literki u i h odpowiednio skróty od UserTimeLine i HomeTimeLine. S u y y wi c w tym przypadku do przekazywania informacji u ytkownikowi o tym, jaki time line aktualnie ogl da
254 Tworzenie nowoczesnych aplikacji graficznych w WPF w pasku zada. Definicja nak adki jest bardzo prosta do w a ciwo ci Overlay klasy TaskbarItemInfo nale y wstawi nazw obrazka, który ma by prezentowany w nak adce, co przedstawia poni szy fragment kodu. <TaskbarItemInfo Overlay="Images\URed.png" /> Dynamiczna zmiana nak adki Rysunki z tego podrozdzia u nie pokazywa y ci gle tej samej nak adki zmienia a si ona wraz ze zmian time line nak adki by y zamieniane w trakcie dzia ania aplikacji. Jednym ze sposobów zmiany obrazka w nak adce jest zdefiniowanie wi zania danych pomi dzy w a ciwo ci Overlay a zmieniaj c si w a ciwo ci TimeLine (podobnie jak to mia o miejsce w przypadku zmiany opisów aplikacji). TimeLine przechowuje jednak jedynie oznaczenia time line, podczas gdy Overlay chce dosta dane obrazka, który ma by umieszczony w nak adce. Konieczne wi c by oby u ycie konwertera (zagadnienie konwerterów jest dok adnie omówione w rozdziale Wi zanie danych ), który zamieni by warto TimeLine na okre lon reprezentacj obrazka. Inn mo liwo ci jest zdefiniowanie zasobu, na przyk ad w oknie Window, jak w poni szym kodzie (zagadnienie zasobów zostanie omówione w rozdziale Zasoby ). <Window.Resources> <DrawingImage x:key="hredoverlay"> <DrawingImage.Drawing> <ImageDrawing ImageSource="Images\HRed.png" Rect="0,0,16,16"/> </DrawingImage.Drawing> </DrawingImage> <DrawingImage x:key="uredoverlay"> <DrawingImage.Drawing> <ImageDrawing ImageSource="Images\URed.png" Rect="0,0,16,16"/> </DrawingImage.Drawing> </DrawingImage> </Window.Resources> Nast pnie w momencie zmiany time line, czyli na przyk ad po naci ni ciu przycisku z paska zada, nale a oby odnale konkretny zasób i wstawi jego warto do w a ciwo ci Overlay: this.taskbariteminfo.overlay = (DrawingImage)FindResource("HRedOverlay"); 8.2. Listy szybkiego dost pu Lista szybkiego dost pu jest tym, co pokazuje si po naci ni ciu prawym przyciskiem myszy na kontrolce aplikacji w pasku zada lub przeci gni ciu kursora myszy do góry z jednocze nie przyci ni tym lewym przyciskiem myszy. Przyk ad listy szybkiego dost pu programu Internet Explorer pokazuje rysunek 8.5. Domy lna lista szybkiego dost pu jest do czana do ka dej aplikacji w systemie Windows 7. Aplikacja mo e mie list szybkiego dost pu zarówno wtedy, kiedy dzia a, jak i wtedy, gdy jest wy czona. Przyk ad domy lnej listy szybkiego dost pu dla aplikacji TwitterClient przedstawia rysunek 8.6.
Rozdzia 8. WPF i Windows 7 255 Rysunek 8.5. Lista szybkiego dost pu programu Internet Explorer w Windows 7 Rysunek 8.6. Lista szybkiego dost pu dla programu TwitterClient, gdy aplikacja jest uruchomiona (po lewej) oraz gdy aplikacja jest zamkni ta (po prawej) Oczywi cie aby lista po prawej stronie rysunku 8.6 mog a by pokazana, konieczne by o przypi cie aplikacji do paska zada. List szybkiego dost pu mo na zmienia za pomoc w a ciwo ci do czonej JumpList. JumpList ustawionej na warto JumpList. Lista jest do czana do pow oki jeden raz, zaraz po uruchomieniu aplikacji, wi c umieszczamy jej definicj w klasie App. Alternatywn mo liwo ci ustawienia listy szybkiego dost pu jest wywo anie metody Jump List.SetJumpList w kodzie proceduralnym. Klasa JumpList posiada w a ciwo JumpItems, do której mo na wpisa zawarto listy. Mog ni by dwie klasy dziedzicz ce po JumpItem JumpTask i JumpPath 2. W skrócie mo na powiedzie, e JumpTask to po czenie kieruj ce do programu, natomiast JumpPath to po czenie prowadz ce do pliku. W kolejnych podrozdzia ach omówi ka d z tych klas. 8.2.1. JumpTask Element JumpTask reprezentuje zadania do wykonania. Na rysunku 8.5 zadaniami s Rozpocznij przegl danie InPrivate i Otwórz now kart. W praktyce s u one do uruchomienia aplikacji z parametrami linii polece. Przyk ad definicji elementu JumpList w aplikacji TwitterClient przedstawia poni szy fragment kodu: 2 A. Nathan, WPF 4 Unleashed, op. cit., s. 234, http://msdn.microsoft.com/en-us/library/ system.windows.shell.jumplist.jumpitems.aspx, 2012-01-22.
256 Tworzenie nowoczesnych aplikacji graficznych w WPF <Application x:class="twitterclient.app" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="MainWindow.xaml"> <JumpList.JumpList> <JumpList> <JumpTask Title="User time line" Arguments="UserTimeLine" Description="Uruchamia TwitterClient w trybie User time line"/> <JumpTask Title="Home time line" Arguments="HomeTimeLine" Description="Uruchamia TwitterClient w trybie Home time line"/> </JumpList> </JumpList.JumpList> </Application> W powy szym kodzie utworzono dwa elementy JumpTask. Pierwszy z nich uruchamia kolejn instancj aplikacji TwitterClient z argumentem UserTimeLine. Drugi uruchamia t aplikacj z parametrem HomeTimeLine. Co to za argumenty? S to po prostu argumenty linii polece, które mo emy odczyta na przyk ad tak: MessageBox.Show("Uruchomiono aplikacj z nast puj cymi argumentami: "+ Environment.CommandLine); i od wyniku uzale ni dzia anie aplikacji (wi cej informacji o metodach odczytywania parametrów przekazanych w linii polece znajduje si w rozdziale Struktura i rodzaje aplikacji WPF ). Rysunek 8.7 pokazuje zarówno wygl d listy zdefiniowanej w powy szym fragmencie kodu, jak i to, co przekazywane jest do aplikacji po wybraniu pierwszego zadania. Do odczytania przekazanych parametrów zosta a wykorzystana klasa Environment i jej w a ciwo CommandLine (jej u ycie wida w pokazanym powy ej fragmencie kodu). CommandLine przechowuje dwie warto ci pierwsza warto to cie ka do aplikacji, natomiast druga to argument przekazany do aplikacji. Argumenty te zosta y wy wietlone w konstruktorze klasy MainWidow za pomoc okienka MessageBox. Rysunek 8.7. JumpList ze zdefiniowanym elementem JumpTask i argumenty przekazane do aplikacji wy wietlone za pomoc MessageBox Co do samego wygl du listy, to wida, e podpowied wy wietlana do ka dego z zada definiowana jest za pomoc w a ciwo ci Desctiption klasy JumpTask. Element Title okre la natomiast tre, która poka e si jako odno nik do danego zadania.
Rozdzia 8. WPF i Windows 7 257 Przeanalizujmy krótko, jak zachowuje si TwitterClient po wybraniu zadania z listy. W przypadku gdy aplikacja jest zamkni ta, przekazywane s odpowiednie argumenty, po czym TwitterClient jest uruchamiany. Spójrzmy teraz na dzia anie listy szybkiego dost pu dla programu Internet Explorer. Po wybraniu zadania Otwórz now kart gdy aplikacja jest wy czona, uruchamiany jest Internet Explorer z now kart czyli analogicznie do naszego przyk adu. A teraz spójrzmy, co si stanie, gdy dla ju uruchomionej aplikacji wybierzemy to samo zadanie nowa karta otwierana jest w tej samej instancji aplikacji. Co natomiast dzieje si w naszym przyk adzie? Za ka dym razem otwierana jest nowa aplikacja. Ten problem mo na rozwi za przy u yciu klasy Microsoft.VisualBasic.ApplicationServices.Windows FormsApplicationBase umo liwia ona zaimplementowanie komunikacji z parametrami przekazywanymi przez lini polece w czasie dzia ania jednej instancji aplikacji. Istniej dodatkowe mo liwo ci definiowania listy szybkiego dost pu. Przyk ad definicji zadania, które uruchamia aplikacj mspaint.exe, oraz ikony dla tego zdania przedstawia poni szy fragment kodu definiuj cy kolejny element JumpTask: <JumpTask/> <JumpTask Title="Paint" Description="Otwiera program Paint" ApplicationPath="%WINDIR%\system32\mspaint.exe" IconResourcePath="%WINDIR%\system32\mspaint.exe"/> <JumpTask/> </JumpList> Na rysunku 8.8 przedstawiono efekt dzia ania tej definicji wida, e w li cie pojawi a si dodatkowa pozycja wraz z ikon (odpowiednio w a ciwo ci ApplicatonPath oraz IconResourcePath). Biblioteki %WINDIR%\System32\shell32.dll i %WINDIR%\System32\imageres.dll zawieraj wiele ikon przydatnych do zastosowania w listach szybkiego dost pu. Rysunek 8.8. Program mspaint.exe uruchamiany za pomoc jednego z zada Po wybraniu tego zadania zostanie uruchomiony program mspaint.exe. Wida, e zarówno ikony, jak i program lokalizowane s za pomoc zmiennych systemowych. Dodatkowo przed i po zadaniu Paint umieszczone zosta y definicje elementów JumpTask
258 Tworzenie nowoczesnych aplikacji graficznych w WPF bez adnych atrybutów s u one do zdefiniowania separatorów równie widocznych na rysunku 8.8. Windows 7 umo liwia równie zgrupowanie elementów znajduj cych si na li cie szybkiego dost pu. S u y do tego w a ciwo CustomCategory typu string klasy JumpItem. Przyk ad definicji przedstawia poni szy fragment kodu: <JumpTask CustomCategory="Programy u ytkownika" Title="User time line" Arguments="UserTimeLine" Description="Uruchamia TwitterClient w trybie User time line"/> <JumpTask CustomCategory="Programy u ytkownika" Title="Home time line" Arguments="HomeTimeLine" Description="Uruchamia TwitterClient w trybie Home time line"/> <JumpTask/> <JumpTask CustomCategory="Programy Windows" Title="Paint" Description="Otwiera program Paint" ApplicationPath="%WINDIR%\system32\mspaint.exe" IconResourcePath="%WINDIR%\system32\mspaint.exe"/> <JumpTask/> Grupy elementów s wi c identyfikowane za pomoc nazwy grupy, do której chc przynale e. Co by si sta o, gdyby dla jednego z elementów w a ciwo CustomCategory zosta a niezdefiniowana? W takim przypadku zosta aby utworzona dla tego elementu domy lna grupa o nazwie Zadania, któr mogli my zobaczy na przyk ad na rysunku 8.7. Wygl d listy po zdefiniowaniu grup tematycznych przedstawia rysunek 8.9. Rysunek 8.9. Poszczególne zadania przydzielone do grup 8.2.2. JumpPath Za po rednictwem JumpPath okre la si elementy wskazuj ce na cie ki do plików, które mog by uruchomione przez dan aplikacj. Przyk ad definicji i dzia ania tego elementu przedstawiony jest w poni szym fragmencie kodu. <JumpList.JumpList> <JumpList> <JumpPath Path="C:\plik_tekstowy.txt" CustomCategory="Pliki"/> </JumpList> </JumpList.JumpList>
Rozdzia 8. WPF i Windows 7 259 Jak wida, definicja JumpPath wygl da analogicznie do JumpTask. cie ka do pliku tekstowego zosta a zdefiniowana za pomoc w a ciwo ci Path oraz umieszczona zosta a w grupie Pliki w a ciwo CustomCategory jest dziedziczona po klasie JumpItem. Na rysunku 8.10 przedstawiono wygl d elementu JumpPath w li cie szybkiego dost pu. Rysunek 8.10. Element JumpPath w li cie szybkiego dost pu Aby zdefiniowany plik plik_tekstowy.txt móg si pokaza na li cie, konieczne jest, by znajdowa si we wskazywanej przez nas lokalizacji. Poniewa nasza aplikacja Twitter Client nie posiada funkcjonalno ci otwierania plików tekstowych, po wybraniu pliku plik_tekstowy.txt z listy zostanie uruchomiona druga instancja aplikacji TwitterClient. W pokazanym fragmencie kodu definiuj cego element JumpPath wida cie k bezwzgl dn do pliku. Jest to jedyna mo liwo wskazania lokalizacji plików w przypadku elementu JumpPath 3. Dlatego te aplikacje, które wykorzystuj ten element, najcz ciej definiuj go w kodzie proceduralnym, co pozwala wykorzysta bie ce ustawienia, np. zmienne rodowiskowe. Na koniec tego podrozdzia u spójrzmy jeszcze raz na list JumpList programu Internet Explorer. Zawiera ona grup o nazwie Cz ste. Pokazywana jest ona cz sto zamiennie z inn grup o nazwie Najnowsze czyli po prostu list cz sto i ostatnio otwieranych plików i zada. Na li cie tej znajduj si pliki i zadania uruchamiane cz sto lub ostatnio za pomoc okna dialogowego do otwierania plików lub konkretnej aplikacji, je eli dany rodzaj pliku zosta z ni skojarzony. Aby taka grupa pokaza a si na naszej li cie, wystarczy ustawi dwie w a ciwo ci klasy JumpList odpowiedzialne za pokazywanie grupy najcz ciej otwieranych plików i ostatnio otwieranych plików odpowiednio ShowFrequentCategory i ShowRecent Category co przedstawia kod zamieszczony poni ej. <JumpList ShowFrequentCategory="True" ShowRecentCategory="True"> </JumpList> 3 Ibidem, s. 241.
260 Tworzenie nowoczesnych aplikacji graficznych w WPF Efekt widoczny jest na li cie JumpList programu TwitterClient rysunek 8.11. Rysunek 8.11. Element JumpList ze zdefiniowanymi w a ciwo ciami ShowFrequentCategory i ShowRecentCategory Na rysunku wida, e zarówno w kategorii Cz ste, jak i Najnowsze prezentowane s te same pliki dlatego te zazwyczaj lista ostatnio otwieranych plików jest stosowana zamiennie z list najcz ciej otwieranych. Plik plik_tekstowy.txt znalaz si na li cie najcz stszych i ostatnich, poniewa pliki.txt zosta y skojarzone w moim systemie z aplikacj TwitterClient, po czym otwarte przy jej u yciu. Generalnie tym, które pliki znajd si na li cie, zajmuje si pow oka Windows, ale mo liwe jest te wymuszenie dodania elementów do omawianych grup poprzez wywo anie funkcji JumpList.AddToRecent Category, której argumentami s albo zadania JumpTask, albo pliki JumpPath. 8.3. Aero Glass Aero Glass jest terminem okre laj cym okno, którego ramki s przezroczyste. Cz b d ca obramowaniem mo e by rozci gni ta na cz u ytkow aplikacji, co pozwala na uzyskanie efektu przezroczystej pow oki. Przyk ady aplikacji wykorzystuj cych Aero Glass to Internet Explorer i Windows Media Player. Istniej dwa ograniczenia co do mo liwo ci definiowania przezroczystego obszaru 4 : Obszar ten musi by prostok tem nie mo e to by inny kszta t. Obszar przezroczysty jest rozszerzeniem ramki okna, wi c nie mo e by zdefiniowany wewn trz okna jedyne opcje to albo przezroczysta ramka dooko a okna, albo ca e przezroczyste okno. 4 M. MacDonald, Pro WPF Windows Presentation Foundation in.net 3.0, op. cit., s. 242.