Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00065 005615 13254813 na godz. na dobę w sumie
Tworzenie nowoczesnych aplikacji graficznych w WPF - książka
Tworzenie nowoczesnych aplikacji graficznych w WPF - książka
Autor: Liczba stron: 584
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-3500-9 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> grafika komputerowa >> inne
Porównaj ceny (książka, ebook (-25%), audiobook).

Dobry interfejs graficzny aplikacji Windows? Tylko z WPF!

Windows Presentation Foundation to nowoczesny system graficzny, umożliwiający tworzenie i wyświetlanie atrakcyjnych wizualnie aplikacji okienkowych dla środowiska Windows. Technologia ta powstała w odpowiedzi na stale rosnącą potrzebę dostarczania wysokiej jakości grafiki, której prezentacja opiera się na wykorzystaniu akceleracji sprzętowej i nie wiąże się z dużym obciążeniem zasobów systemowych. Oddzielenie warstwy interfejsu użytkownika od logiki aplikacji umożliwia definiowanie interfejsów przy użyciu deklaratywnego języka XAML. Upraszcza tym samym proces tworzenia przejrzystych i elastycznych GUI.

Każdy szanujący się autor programów działających pod kontrolą systemów Windows powinien dobrze opanować WPF, zwłaszcza jeśli ma na celu produkowanie naprawdę interesujących aplikacji okienkowych przy możliwie niewielkim nakładzie sił i środków. Pomoże mu w tym odpowiednie źródło wiedzy, takie jak książka 'Tworzenie nowoczesnych aplikacji graficznych w WPF '. W ciekawy i przestępny sposób zostały w niej zaprezentowane najważniejsze informacje na temat korzystania z Windows Presentation Foundation, tworzenia nowoczesnych interfejsów użytkownika, zastosowania języka XAML, a także wyświetlania grafiki i animacji czy obsługi zdarzeń związanych z używaniem różnego rodzaju urządzeń wskazujących.

A wszystko to w oparciu o szereg praktycznych i ciekawych przykładów!

Sięgnij po jedną z nielicznych książek poświęconych technologii WPF i twórz nowoczesne aplikacje graficzne!

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

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 po- kazywane 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ą wia- domoĞci byáo przezroczyste. 8.1. Dostosowywanie paska zadaþ Pasek zadaĔ w systemie Windows 7 ma trochĊ inny wygląd niĪ jego poprzednicy, po- siada równieĪ pewne nowe funkcje. Zapewne kaĪdy zauwaĪyá, Īe w momencie naje- chania kursorem na pasek zadaĔ poszczególne ikony oznaczające aplikacje są kolo- rowane 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 wy- ją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Ċ zaimple- mentowaü 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 podroz- dziaá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 ry- sunku 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 tema- tycznie, 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”. Po- niewaĔ 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. i 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 prze- ciwnym 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 swo- jej 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 ry- sunku 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 funk- cjonalnoĞ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= ImagesUGreen.png Click= user_Click / ThumbButtonInfo Description= Home Timeline ´ImageSource= ImagesHGreen.png Click= home_Click / ThumbButtonInfo Description= Public Timeline ´ImageSource= ImagesPGreen.png Click= public_Click / ThumbButtonInfo Description= Mentions ImageSource= ImagesMGreen.png ´Click= mentions_Click / ThumbButtonInfo Description= Retweeted By Me ´ImageSource= ImagesRGreen.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. i 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 do- tychczasowych 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 przyj- mowaü nastĊpujące wartoĞci1:  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 po- wyĪ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 Na koniec zostaáy nam nakáadki. Nakáadka równieĪ byáa widoczna na kaĪdym z po- przednich 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Īytkowni- kowi. Na powyĪszych przykáadach widoczne byáy naprzemiennie literki u i h — od- powiednio 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 1 Ibidem, s. 246. 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 na- káadce, co przedstawia poniĪszy fragment kodu. TaskbarItemInfo Overlay= ImagesURed.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 przypad- ku 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= ImagesHRed.png Rect= 0,0,16,16 / /DrawingImage.Drawing /DrawingImage DrawingImage x:Key= URedOverlay DrawingImage.Drawing ImageDrawing ImageSource= ImagesURed.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 Win- dows 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 apli- kacji TwitterClient przedstawia rysunek 8.6. Rozdziaä 8. i 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, za- raz po uruchomieniu aplikacji, wiĊc umieszczamy jej definicjĊ w klasie App. Alterna- tywną 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 JumpPath2. 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Ğwie- tlone 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. i 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 argu- menty, 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 przy- kä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 pa- rametrami 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 przedsta- wia poniĪszy fragment kodu definiujący kolejny element JumpTask: JumpTask/ JumpTask Title= Paint Description= Otwiera program Paint ApplicationPath= WINDIR system32mspaint.exe IconResourcePath= WINDIR system32mspaint.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 System32shell32.dll i WINDIR System32imageres.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 za- ró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 system32mspaint.exe IconResourcePath= WINDIR system32mspaint.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 do- myĞ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. i 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Ċ bez- wzglĊdną do pliku. Jest to jedyna moĪliwoĞü wskazania lokalizacji plików w przypadku elementu JumpPath3. 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 otwiera- nych 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 pli- kó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 apli- kacją 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 obszaru4:  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. Rozdziaä 8. i WPF i Windows 7 261 Efekt rozciągniĊcia obramowania okna Aero Glass moĪna uzyskaü, wykorzystując API biblioteki dwmapi.dll, konkretnie funkcjĊ DwmExtendFrameIntoClientArea. Za jej pomocą moĪna rozszerzyü obramowanie okna na caáy obszar roboczy lub jego czĊĞü. Aby byáo moĪliwe uĪycie funkcji pochodzącej z kodu niezarządzanego, konieczne jest skorzystanie z mechanizmu PInvoke (ang. Platform Invocation Service). UmoĪliwia on przy wykorzystaniu atrybutu [DllImport] importowanie funkcji zapisanych w kodzie niezarządzanym w bibliotekach DLL. PoniĪej znajduje siĊ przykáad definicji klasy AeroGlass, w której zdefiniowana jest metoda ExtendGlass uĪywająca metody DwmExtend ´FrameIntoClientArea. Na początku definiujemy strukturĊ, która bĊdzie przechowy- waü odpowiednie marginesy. NastĊpnie za pomocą Platform Invocation Services de- klarujemy uĪycie metod z biblioteki. Jedna z nich to wspomniana DwmExtendFrameInto ´ClientArea, druga bĊdzie nam sáuĪyáa do sprawdzenia, czy kompozycja pulpitu jest wáączona. Kompozycja pulpitu Kompozycja pulpitu (ang. Desktop composition) to funkcjonalnoĈè zaprezentowana pierwszy raz w Windows Vista. Zmienia ona sposób, w jaki aplikacje pokazujñ piksele na ekranie, mianowicie jeĔeli kompozycja jest wäñczona, nie rysujñ one okien bezpoĈrednio na ekranie, lecz ich instrukcje odnoĈnie do rysowania obiektów sñ przekierowywane do urzñdzenia gra- ficznego. Dopiero to urzñdzenie renderuje ostatecznñ zawartoĈè. Kompozycjñ pulpitu zarzñdza DMW, czyli Desktop Windows Manager. Funkcjonuje on jako usäuga systemowa i moĔe byè wyäñczony za pomocñ narzödzi administracyjnych. Stosujñc kompozycjö pulpitu, DMW udostöpnia szereg efektów na ekranie, do których naleĔñ miödzy innymi wsparcie dla wysokich rozdzielczoĈci czy omawiane okna typu „Glass”5. Rozszerzenie ramki okna nastąpi jedynie w przypadku, gdy kompozycja pulpitu jest wáączona oraz wersja systemu nie jest niĪsza niĪ 6 (wersje systemów operacyjnych Windows Vista i póĨniejsze). W kolejnych liniach widzimy: pobranie uchwytu dla okna, zdefiniowanie jego táa na przezroczyste, pobranie rozdzielczoĞci ekranu (aby marginesy zostaáy poprawnie obliczo- ne) oraz wywoáanie metody DwmExtendFrameIntoClientArea z odpowiednio przeliczo- nymi wartoĞciami struktury MARGIN. using System; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Interop; using System.Windows.Media; [StructLayout(LayoutKind.Sequential)] public struct MARGINS { public MARGINS(Thickness thickness, float dpiX, float dpiY) { Left = (int)(thickness.Left * dpiX); Right = (int)(thickness.Right * dpiX); Top = (int)(thickness.Top * dpiY); Bottom = (int)(thickness.Bottom * dpiY); 5 http://msdn.microsoft.com/en-us/library/windows/desktop/aa969540 28v=vs.85 29.aspx, 2012-01-22. 262 Tworzenie nowoczesnych aplikacji graficznych w WPF } public int Left; public int Right; public int Top; public int Bottom; } public class AeroGlass { //deklaracja metod z biblioteki dwmapi.dll [DllImport( dwmapi.dll , PreserveSig = false)] static extern void DwmExtendFrameIntoClientArea( IntPtr hWnd, ref MARGINS pMarInset); [DllImport( dwmapi.dll , PreserveSig = false)] static extern bool DwmIsCompositionEnabled(); public static void ExtendGlass(Window window, Thickness margin) { //jeĪeli kompozycja jest nieustawiona lub system jest w starszej wersji, nic nie robimy if (DwmIsCompositionEnabled() Environment.OSVersion.Version.Major 5) { //uchwyt dla okna WindowInteropHelper helper = new WindowInteropHelper(window); HwndSource mainWindowSrc = (HwndSource)HwndSource. FromHwnd(helper.Handle); // ustawienie táa okna na przezroczysty window.Background = Brushes.Transparent; mainWindowSrc.CompositionTarget.BackgroundColor = Colors.Transparent; //pobieramy rozdzielczoĞü System.Drawing.Graphics desktop = System.Drawing.Graphics.FromHwnd(mainWindowSrc.Handle); float dpiX = desktop.DpiX / 96; float dpiY = desktop.DpiY / 96; //ustawiamy marginesy MARGINS margins = new MARGINS(margin, dpiX, dpiY); //zwiĊkszamy przezroczystą ramkĊ o stosowny rozmiar DwmExtendFrameIntoClientArea(mainWindowSrc.Handle, ref margins); } else { window.Background = SystemColors.WindowBrush; } } } Teraz trzeba jeszcze w naszej klasie MainWindow wywoáaü metodĊ ExtendGlass klasy AeroGlass. PoniĪej zamieszczono przykáad uĪycia w nadpisanej metodzie OnSource ´Initializes. Przekazany argument new Thickness(-1) oznacza, Īe ramka okna zosta- nie rozszerzona na caáą jego powierzchniĊ. protected override void OnSourceInitialized(EventArgs e) { base.OnSourceInitialized(e); AeroGlass.ExtendGlass(this, new Thickness(-1)); IntPtr hwnd = new WindowInteropHelper(this).Handle; HwndSource.FromHwnd(hwnd).AddHook(new HwndSourceHook(WndProc)); } Rozdziaä 8. i WPF i Windows 7 263 Do uruchomienia pozostaáo jeszcze jedno — poniewaĪ uĪytkownik moĪe wáączyü lub wyáączyü kompozycjĊ pulpitu, naleĪy zadbaü o wáączenie lub wyáączenie w zaleĪnoĞci od sytuacji naszego okna. MoĪna do tego wykorzystaü metodĊ WndProc, która przetwarza wszystkie wiadomoĞci wysyáane do okna. private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { if (msg == WM_DWMCOMPOSITIONCHANGED) { AeroGlass.ExtendGlass(this, new Thickness(-1)); handled = true; } return IntPtr.Zero; } WM_DWMCOMPOSITIONCHANGED to staáa zdefiniowana w klasie, przechowująca kod wia- domoĞci o zmianie okna (0x031E), co pokazano poniĪej. private const int WM_DWMCOMPOSITIONCHANGED = 0x031E; Spójrzmy wiĊc, jak wygląda „szklany” TwitterClient — rysunek 8.12. Rysunek 8.12. TwitterClient z poszerzoną ramką Aero Glass 264 Tworzenie nowoczesnych aplikacji graficznych w WPF Pytania testowe 1. Klasą, która umoĪliwia zmianĊ koloru táa okienka w pasku zadaĔ po najechaniu kursorem myszy na ikonĊ aplikacji, jest: a) TaskbarItemInfo, b) ThumbButtonInfo, c) JumpList. 2. ZawartoĞü którego z elementów wyĞwietlanych w oknie podpowiedzi i w pasku zadaĔ moĪe byü zdefiniowana jak obrazek? a) nakáadka, b) opis, c) zawartoĞü przycisku ThumButtonInfo. 3. Która z poniĪszych wartoĞci wáaĞciwoĞci ProgressState wskazuje stan, w którym proces jest wykonywany, lecz nie da siĊ okreĞliü stopnia jego zaawansowania? a) Normal, b) None, c) Indeterminate. 4. Wybierz zdanie, które jest prawdziwe dla poniĪszej definicji elementu TaskbarItemInfo: TaskbarItemInfo ProgressState= Error ProgressValue= 50 / a) Okno programu w pasku zadaĔ zostanie zakolorowane na pomaraĔczowo, postĊp wykonania procesu to 50 . b) Okno programu w pasku zadaĔ zostanie zakolorowane na czerwono, postĊp wykonania procesu to 100 . c) Zdefiniowanie wartoĞci 50 spowoduje báąd kompilacji, poniewaĪ wartoĞü wychodzi poza dopuszczalne granice. 5. Wybierz prawdziwe zdanie. a) JumpTask sáuĪy do definiowania akcj
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Tworzenie nowoczesnych aplikacji graficznych w WPF
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: