Kwalifikacje kadry dydaktycznej kluczem do rozwoju Uczelni PROJEKT WSPÓŁFINANSOWANY ZE ŚRODKÓW UNII EUROPEJSKIEJ I EUROPEJSKIEGO FUNDUSZU SPOŁECZNEGO Uniwersytet Kazimierza Wielkiego w Bydgoszczy Wydział Matematyki, Fizyki i Techniki specjalność: Sieci i systemy rozproszone Technologie mobilne i rozproszone na platformie.net Wykład 7 Czas. Binding. Pliki. Launchers, choosers Czas w WP7 (Silverlight) DateTime struktura do odczytu czasu, TimeSpan struktura odstępu czasu Generowanie akcji czasowych using System.Windows.Threading; obiekt klasy DispatcherTimer, metoda Start/Stop rozpoczęcie/zakończenie właściwość Interval okres czasu w milisekundach, zdarzenie Tick generowane co Interval. 3 1
Czas - przykład //zmienna, czas aktualny (18.04.2012) DateTime wakacjeod, dt = DateTime.Now; int rok = dt.year; //2012 int miesiąc = dt.month; //4 int dzień = dt.day; //18 int godzina = dt.hour; wakacjeod = DateTime.Parse("2012-07-01"); //od 1 lipca TimeSpan dowakacji = wakacjeod - dt; double dni = dowakacji.totaldays; double godzin = dowakacji.totalhours //ile do wakacji //liczba dni //liczba godzin 4 Akcje czasowe using System.Windows.Threading; private System.Windows.Threading.DispatcherTimer dt = new System.Windows.Threading.DispatcherTimer(); public MainPage() dt.interval = new TimeSpan(0, 0, 0, 0, 500); // 500 Milliseconds dt.tick += new EventHandler(dt_Tick); void dt_tick(object sender, EventArgs e) DateTime aktczas = DateTime.Now; 5 Data binding (binding) Łączy dwie właściwości dwóch obiektów zmiana jednej z nich powoduje odpowiednią modyfikację drugiej Przykład kontrolka Slider, kontrolka TextBlock zmiana wartości w kontrolce Slider efekt - zmiana wartość wyświetlanej w TextBlock kontrolka ListBox, kolumna tabeli (BD), podpięcie kolekcji do ListBox-a, itp 6 2
Użycie Składnia właściowśćobiektudocelowego = "Binding ElementName = nazwaobiektuźródłowego, Path = nazwawłaściowściobiektuźródłoweogo" Przykład <TextBlock Name="SliderValue" Text="Binding ElementName=Slider1, Path=Value" w wyrażeniu Binding wszystkie właściwości są definiowane bez cudzysłowów! 7 Przykład Klasycznie (bez DataBinding) kod xml: <Slider Name="sldSuwak" Minimum="-90" Maximum="90" ValueChanged="sldSuwak_ValueChanged"/> <TextBlock Name="txtKlasycznie" Text="0"/> i procedura zdarzeniowa private void sldsuwak_valuechanged(object sender, txtklasycznie.text = sldsuwak.value.tostring(); 8 Użycie DataBinding kod xml: <Slider Name="sldSuwak" Minimum="-90" Maximum="90"/> <TextBlock Name="txtBinding" Text="Binding ElementName=sldSuwak, Path=Value "/> i procedura zdarzeniowa niepotrzebna 9 3
Trwały zapis danych Isolated Storage przestrzeń do przechowywania danych używanych przez aplikacje operujemy za pomocą wirtualnego systemu plików Izolacja danych do danych aplikacji w Isolated Storage nie mają dostępu inne aplikacje, żadna aplikacja nie ma bezpośredniego dostępu do systemu plików w Windows Phone 7 Dlaczego tak? bezpieczeństwo systemu chroni przed nieautoryzowanym dostępem do danych. 10 IS w WP7 Różnice w stosunku do PC-Silverlight nie są obsługiwane strony, dane są przechowywane jedynie na poziomie aplikacji, deinstalacja programu usuwa dane! nie ma quoty na rozmiar na dysku desktop: 1MB z możliwością zwiększenia 8*1 9 GB WP7: maksymalnie rozmiar aplikacji 11 Co można zapisać lokalne ustawienia pliki foldery 12 4
Co potrzebne Przestrzeń nazw using System.IO.IsolatedStorage; using System.IO; Klasy do zarządzania plikami i folderami: IsolatedStorageFile reprezentuje przestrzeń Isolated Storage zawierającą pliki i foldery, IsolatedFileStream reprezentuje strumień zapewniający dostęp do pliku w Isolated Storage StreamWriter: obiekt umożliwiający zapis do plików Uwaga magazyn należy zamknąć po zakończeniu z korzystania! 13 Uwaga na using Otwarcie pliku do zapisu i zapisanie tekstu using (TextWriter tw = new StreamWriter("file.txt")) tw.write ("Zapisywany tekst do pliku "); // tutaj plik jest już zamknięty Instrukcja using (ogólnie w C#!) w tym kontekście nie dotyczy przestrzeni nazw określa obiekt/y używany wewnątrz bloku zasoby związane z tym blokiem zostaną zwolnione po wyjściu z bloku 14 Metody (wybrane) IsolatedStorageFile CreateDirectory(stringdir) CreateFile(stringpath) DeleteDirectory(string dir) DeleteFile(string path) bool DirectoryExists(stringpath) bool FileExists(stringpath) string[]getfilenames() tablica nazw plików katalogu głównego 15 5
Przykłady cz. I using (IsolatedStorageFile isostore = IsolatedStorageFile.GetUserStoreForApplication()) // kartoteka; w niej kolejna kartoteka isostore.createdirectory("topleveldirectory"); isostore.createdirectory("topleveldirectory/secondlevel"); // dwie nowe kartoteki, jedna w drugiej isostore.createdirectory("anothertopleveldirectory/insidedirectory"); // plik w kartotece głównej IsolatedStorageFileStream isostream1 = new IsolatedStorageFileStream ( "InTheRoot.txt", FileMode.Create, isostore); isostream1.close(); 16 Przykłady, cd using (IsolatedStorageFile isostore = IsolatedStorageFile.GetUserStoreForApplication()) // plik wewnątrz kartoteki InsideDirectory IsolatedStorageFileStream isostream2 = new IsolatedStorageFileStream( "AnotherTopLevelDirectory/InsideDirectory/HereIAm.txt", FileMode.Create, isostore); isostream2.close(); 17 Zapis prostych danych Zapis zawartości danetxt Do pliku file1 string danetxt = "Ala ma kota, a As to Ali pies"; using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication()) using (IsolatedStorageFileStream isfstream = isf.createfile("file1")) StreamWriter writer = new StreamWriter(isfStream); writer.write(danetxt); writer.close(); 18 6
Odczyt danych z pliku Z pliku file1 do zmiennej danetxt!! uwaga na błędy I/O!! string danetxt = ""; using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication()) using (IsolatedStorageFileStream readerstream = isf.openfile("file1", FileMode.Open)) StreamReader reader = new StreamReader(readerStream); danetxt = reader.readtoend(); reader.close(); 19 Zapis pary: klucz - wartość Ustawienia aplikacji kolor, czcionka, dane adresowe, itp Klasa IsolatedStorageSettings za pomocą słownika odwołujemy się do danych: w pliku _ApplicationSettings, dane w formacie xml: element (klucz): wartość elementu Przykład: string klucz, wart: string lub obiekt(!) //zapis IsolatedStorageSettings.ApplicationSettings[klucz] = wart; //odczyt wart = IsolatedStorageSettings.ApplicationSettings[klucz] as string; 20 Przykład //zapis for (int i = 1; i < 10; i++) string klucz = "klucz-" + i; string wart = "wartość: " + i * 10; IsolatedStorageSettings.ApplicationSettings[klucz] = wart; //odczyt string wart = ""; for (int i = 1; i < 10; i++) string klucz = "klucz-" + i; wart += IsolatedStorageSettings.ApplicationSettings[klucz] as string; 21 7
Inne operacje Deklaracja obiektu IsolatedStorageSettings IsolatedStorageSettings isostore= IsolatedStorageSettings.ApplicationSettings; Usunięcie klucza string klucz bool isostore.remove(klucz); Dodanie klucza i wartości isostore.add(klucz, wartość); Zapis isostore.save(); Odczyt (użyj bloku try-catch!) string wart = (string)isolatedstore[klucz]; 22 Launchers Funkcje udostępniane przez standardowe programy WP7 zainstalowane w środowisku WP. Można wołać z poziomu naszego programu można określić parametry wejściowe po zakończeniu program użytkownika jest wznawiany launcher nie zwraca wyników do naszego programu! Niezbędna przestrzeń nazw: Microsoft.Phone.Task 23 PhoneCallTask Wywołanie telefonu można określić numer decyzja o połączeniu - użytkownik PhoneCallTask tel = new PhoneCallTask(); tel.phonenumber = "123456"; tel.show(); 24 8
EmailComposeTask Program pocztowy zdefiniowanie własności wiadomości e- mail uruchomienie programu obsługi poczty, użytkownik może wysłać widomość, musi być zdefiniowane konto pocztowe! Nie działa na emulatorze EmailComposeTask list = new EmailComposeTask(); list.to = "adres@poczty.pl"; list.subject = "temat listu"; list.body = "treść listu"; list.show(); 25 SmsComposeTask Program do redagowania sms-a decyzja o wysłaniu użytkownik! SmsComposeTask mójsms = new SmsComposeTask(); mójsms.to = "1800-180-1800"; mójsms.body = "Cool Phone!!"; mójsms.show(); 26 Inne WebBrowserTask przeglądarka internetowa z załadowanym URI; SearchTask BingSearch z hasłem do wyszukania; MediaPlayerLauncher MediaPlayer z załadowanym plikiem do odtwarzania; MarketplaceDetailsTask wyświetlenie informacji o wybranym programie w Market Place; MarketplaceHubTask uruchomienie klienta programu Windows Phone Marketplace; MarketplaceSearchTask; MarketplaceReviewTask przeszukiwanie Marketplace; "review" dla określonego produktu; SaveEmailAddressTask zapisanie lub dodanie do istniejącego kontaktu adresu e-mail SavePhoneNumberTask zapisanie lub dodanie do istniejącego kontaktu numeru telefonu 27 9
Choosers Z poziomu programu użytkownika uruchomienie standardowych programów WP, z zadanymi parametrami wejściowymi, po zakończeniu chooser: zwraca do programu użytkownika wyniki swego działania np. zdjęcie wykonane aparatem telefonu zwracany jest uchwyt do zdarzenia informującego o zakończeniu działanie chooser a Zdefiniowane w przestrzeni nazw: Microsoft.Phone.Tasks 28 Dostępne choosers umożliwiają CameraCaptureTask zrobienie zdjęcia; EmailAddressChooserTask wybór z listy kontaktów adresu e-mail PhoneNumberChooserTask wybór z listy kontaktów numeru PhotoChooserTask PhotoPickerdo przeglądu i wyboru zdjęcia Contacts wyszukanie kontaktu na podstawie adresu e-mail czy numeru telefonu Appointments wyszukanie wydarzeń (spotkań) w kalendarzu 29 Przykład: CameraCaptureTask Wyświetlenie zrobionego zdjęcia 1. utworzyć prywatną zmienną CameraCaptureTaskpcht 2. w konstruktorze klasy danej strony zainicjować obiekt pcht, utworzyć uchwyt do zdarzenia pcht.completed 3. zaimplementować obsługę zdarzenia pcht_completed szkielet metody może być wygenerowany automatycznie w chwili deklarowania zdarzenia pcht_completed 2 x [TAB] wykorzystać właściwość TaskResult parametru e do przekazania nazwy pliku ze zrobionym zdjęciem do kontrolki typu Image obiekt BitmapImage w przestrzeni nazw System.Windows.Media.Imaging 4. Wywołać metodę Show obiektu pcht 30 10
Kod przykładu xaml: button + kontrolka Image <Button Name="btnZapis" Content="FOTO" Click="btnZapis_Click"/> <Image Name="obrazek" Height="526" Width="444"/> private CameraCaptureTask foto; public MainPage() InitializeComponent(); foto = new CameraCaptureTask(); foto.completed += new EventHandler<PhotoResult>(pcht_Completed); void pcht_completed(object sender, PhotoResult e) if (e.taskresult == TaskResult.OK) obrazek.source = new BitmapImage(new Uri(e.OriginalFileName)); private void btnzapis_click(object sender, RoutedEventArgs e) foto.show(); 31 Uruchomienie programu 32 11