Programowanie w technologii.net wykład 4 Aplikacja i okna



Podobne dokumenty
xmlns:prism= c. <ContentControl prism:regionmanager.regionname="mainregion" />

Dodanie nowej formy do projektu polega na:

Biblioteka Windows Forms

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Programowanie obiektowe i zdarzeniowe wykład 1 Wprowadzenie do programowania zdarzeniowego

Visual Studio instalacja

Rozdział 3. Zapisywanie stanu aplikacji w ustawieniach lokalnych

Metodyka programowania. Visual Studio C# Formularze

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Utworzenie aplikacji mobilnej Po uruchomieniu Visual Studio pokazuje się ekran powitalny. Po lewej stronie odnośniki do otworzenia lub stworzenia

Programowanie telefonów z Windows Phone 7, cz. 2

Instrukcja laboratoryjna cz.3

using System;... using System.Threading;

Programowanie obiektowe

Tworzymy projekt File->New Project->Java Application, przy czym tym razem odznaczamy create main class

Wykład 7 Okna dialogowe, menu, pasek stanu itp.

Programowanie obiektowe i zdarzeniowe

Wykład 5 Okna MDI i SDI, dziedziczenie

Kurs programowania 2 - listy

2. W oknie dialogowym Choose Toolbox Items w zakładce.net Framework Components naciskamy przycisk Browse...

Projektowanie Graficznych Interfejsów Użytkownika Robert Szmurło

Prosta książka telefoniczna z wykorzystaniem zapisu do pliku

Język JAVA podstawy. wykład 2, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Podstawowe kontrolki graficzne. Obsługa plików poprzez kontrolki

Metodyka programowania. Edytor tekstu. Specyfikacja

Programowanie w środowisku graficznym GUI

Wybieramy File->New->Project Wybieramy aplikację MFC->MFC Application jak na rysunku poniżej:

Dell Display Manager podręcznik użytkownika

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Interfejs użytkownika (ang. User Interface, UI) w technice część urządzenia odpowiedzialna za interakcję z użytkownikiem

Platformy Programowania

Podręczna pomoc Microsoft Power Point 2007

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Tworzenie okna dialogowego w edytorze raportu SigmaNEST. część 1

Przykładowa dostępna aplikacja w Visual Studio - krok po kroku

Edytor tekstu MS Word podstawy

Laboratorium - Podgląd informacji kart sieciowych bezprzewodowych i przewodowych

wstawianie przycisków umożliwiających wybieranie wartości poprzez klikanie strzałek

Temat: Organizacja skoroszytów i arkuszy

Informatyka II. Laboratorium Aplikacja okienkowa

Projektowanie aplikacji internetowych laboratorium

Informatyka Edytor tekstów Word 2010 dla WINDOWS cz.1

Logger. Następnie w klasie Bootstrapper muimy zarejestrować nasz nowy logger:

Oficyna Wydawnicza UNIMEX ebook z zabezpieczeniami DRM

Informatyka Arkusz kalkulacyjny Excel 2010 dla WINDOWS cz. 1

Klasy i obiekty cz II

Informatyka Arkusz kalkulacyjny Excel 2010 dla WINDOWS cz. 1

Komunikatory typu TCP/IP lab2. Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych

Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

Programowanie obiektowe

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Laboratorium - Poznawanie FTP

Podstawy programowania. Ćwiczenie. Pojęcia bazowe. Języki programowania. Środowisko programowania Visual Studio

Komputery I (2) Panel sterowania:

Programowanie obiektowe

HELIOS pomoc społeczna

Programowanie telefonów z Windows Phone 7, cz. 4

Dell UltraSharp UP3017 Dell Display Manager Instrukcja użytkownika

Ćwiczenie 6 Proste aplikacje - podstawowe komponenty.

Dodawanie grafiki i obiektów

1. Wprowadzenie do WPF i XAML. Tworzenie interfejsu użytkownika.

Formy dialogowe w środowisku Gnome

Włóż płytę instalacyjną z systemem Windows Vista do napędu DVD ROM lub podłącz pamięć flash USB do portu USB.

Instrukcja implementacji sterownika wirtualnego portu szeregowego dla systemu Android. Opracowanie: Elzab Soft sp. z o.o.

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Kontenery i komponenty graficzne

Rozdział II. Praca z systemem operacyjnym

Compas 2026 Vision Instrukcja obsługi do wersji 1.07

Wprowadzenie do projektu QualitySpy

Informatyka Edytor tekstów Word 2010 dla WINDOWS cz.1

Użycie Visual Basic for Applications ("VBA")

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Rozdział 2. Konfiguracja środowiska pracy uŝytkownika

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Laboratorium - Harmonogramowanie zadania przy użyciu GUI i polecenia AT w systemie Windows 7

Synchronizator plików (SSC) - dokumentacja

Laboratorium - Używanie programu Wireshark do obserwacji mechanizmu uzgodnienia trójetapowego TCP

Multimedia JAVA. Historia

Korzystanie z edytora zasad grupy do zarządzania zasadami komputera lokalnego w systemie Windows XP

BAZY DANYCH Panel sterujący

Tworzenie prezentacji w MS PowerPoint

VComNet Podręcznik użytkownika. VComNet. Podręcznik użytkownika Wstęp

TURNINGPOINT KROKI DO URUCHOMIENIA TESTU NA PC

Lokalizacja Oprogramowania

Laboratorium - Zarządzanie systemem plików poprzez wbudowane oprogramowanie w systemie Windows Vista

Tablet bezprzewodowy QIT30. Oprogramowanie Macro Key Manager

Laboratorium - Narzędzia linii uruchamiania w systemie Windows 7

I. Spis treści I. Spis treści... 2 II. Kreator szablonów Tworzenie szablonu Menu... 4 a. Opis ikon Dodanie nowego elementu...

Celem ćwiczenia jest zapoznanie się z podstawowymi funkcjami i pojęciami związanymi ze środowiskiem AutoCAD 2012 w polskiej wersji językowej.

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

CZĘŚĆ A PIERWSZE KROKI Z KOMPUTEREM

ROZDZIAŁ 1. PRZEGLĄD BRAMOFONU SAFE...

Edytor tekstu OpenOffice Writer Podstawy

Laboratorium - Harmonogramowanie zadania przy użyciu GUI i polecenia AT w systemie Windows Vista

Instrukcja instalacji i obsługi modemu ED77 pod systemem operacyjnym Windows 98 SE (wydanie drugie)

WINDOWS XP PRO WINDOWS XP PRO

Programowanie obiektowe

Transkrypt:

Programowanie w technologii.net wykład 4 Aplikacja i okna 1/30 Aplikacja Aplikacja WPF jest reprezentowana przez instancję klasy System.Windows.Application. pilnuje ona kiedy program się uruchamia i kończy zarządza otwartymi oknami aplikacji odpala zdarzenia aplikacji (do inicjalizacji i sprzątania) Cykl życia aplikacji: uruchomienie programu stworzenie obiektu klasy System.Windows.Application wywołana zostaje metoda Application.Run() zgłaszane jest zdarzenie Application.Startup tworzone są okna, uruchamiane i obsługiwane różne zdarzenia wywołana zostaje metoda Application.Shutdown() zgłaszane jest zdarzenie Application.Exit metoda Run kończy działanie

2/30 Ręczne tworzenie aplikacji (np. w projekcie konsolowym): using System; using System.Windows; public class MyApp [STAThread()] static void Main() // tworzenie obiektu aplikacji. Application app = new Application(); // tworzenie głównego okna Window1 win = new Window1(); // uruchomienie aplikacji (zarazem otwarcie okienka) app.run(win); // inaczej: app.mainwindow = win; win.show(); // utrzymuje aplikację przy życiu app.run(); po zamknięciu okien aplikacji i opuszczeniu metody Run kontynuowany jest kod Maina

3/30 Przeważnie dziedziczymy z klasy Application, np. aby obsługiwać zdarzenia aplikacji. XAML: <Application x:class="testapplication.app"... StartupUri="Window1.xaml"> </Application> C#: public partial class App : Application StartupUri po to, aby XAML od razu otworzył też główne okno

4/30 Standardowo klasa Application trzyma aplikację przy życiu do momentu, aż ostatnie okno aplikacji zostanie zamknięte. Inne metody zamknięcia aplikacji można określić we własności ShutdownMode: OnLastWindowClose (domyślne) gdy wszystkie okna zostaną zamknięte OnMainWindowClose gdy główne okno aplikacji zostanie zamknięte (pozostałe zamkną się same) OnExplicitShutdown aplikacja nigdy się nie kończy (musimy zatrzymać ją ręcznie wywołując metodę Application.Shutdown()) <Application x:class="testapplication.app"... StartupUri="Window1.xaml" ShutdownMode="OnMainWindowClose"> </Application>

5/30 zdarzenia aplikacji: Startup gdy wywołano Run, ale zanim pokaże się okno; używane przeważnie do sprawdzania argumentów wiersza poleceń i inicjalizacji aplikacji Exit gdy aplikacja się kończy, tuż przed wyjście z Run; jest za późno by to anulować; używane by przekazać kod wyjścia SessionEnding kończy się sesja użytkownika (wylogowuje się lub wyłącza komputer); możemy to jeszcze anulować Activated gdy jedno z okien aplikacji zostanie aktywowane po raz pierwszy gdy pojawia się nasze okno, potem gdy użytkownik przełącza się z innej aplikacji na naszą Deactivated na odwrót gdy przełącza się na inną aplikację DispatcherUnhandledException gdy w aplikacji (głównym wątku!) wystąpił nieobsłużony wyjątek; możemy go tu obsłużyć i kontynuować działanie programu obsługiwanie zdarzeń na dwa sposoby: podłączenie handlera obsługującego zdarzenie przeciążenie odpowiedniej metody

sposób pierwszy: <Application x:class="myapplication.app"... StartupUri="Window1.xaml" DispatcherUnhandledException="wyjatek"> </Application> zaś w klasie dodajemy metodę: public partial class App : Application private void wyjatek(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) MessageBox.Show("Nieobsłużony wyjątek " + e.exception.gettype().tostring()); using (StreamWriter errorlog = new StreamWriter("c:\\error.log", true)) errorlog.writeline("error @ " + DateTime.Now.ToString()); errorlog.writeline(e.exception.tostring()); e.handled = true; 6/30

sposób drugi: public partial class App : Application public bool UnsavedData get; set; protected override void OnStartup(StartupEventArgs e) base.onstartup(e); UnsavedData = true; protected override void OnSessionEnding( SessionEndingCancelEventArgs e) // dobrą praktyką jest wywołać metodę z klasy bazowej base.onsessionending(e); if (UnsavedData) e.cancel = true; MessageBox.Show("Dane nie zostały zapisane." + "Aplikacja nie może się zakończyć."); 7/30

Zadania aplikacji obsługa argumentów wiersza poleceń dostęp do bieżącej aplikacji interakcja pomiędzy oknami aplikacje posiadające tylko jedną instancję w WPF można uruchomić dowolną liczbę instancji aplikacji nie sprawdza się to w aplikacjach opartych na dokumentach (np. MS Word) brak wsparcia dla pojedynczej instancji aplikacji (konieczność własnego implementowania rozwiązania) 8/30

9/30 Argumenty wiersza poleceń dostępne jako tablica napisów poprzez własność StartupEventArgs.Args w obsłudze zdarzenia Startup: private static void App_Startup(object sender, StartupEventArgs e) MyWindow win = new MyWindow(); if (e.args.length > 0) string file = e.args[0]; if (System.IO.File.Exists(file)) // załadowanie pliku do okienka dokumentu win.loadfile(file); else // alternatywna ścieżka pusty dokument win.show();

10/30 Dostęp do bieżącej aplikacji możliwy z dowolnego miejsca aplikacji poprzez statyczną własność Application.Current daje dostęp do głównego okna aplikacji poprzez własność Application.Current.MainWindow: Window1 main = (Window1)Application.Current.MainWindow; main.dosomething(); daje dostęp do kolekcji wszystkich otwartych okien aplikacji poprzez własność Application.Current.Windows

Interakcja pomiędzy oknami W głównej klasie aplikacji możemy przechowywać referencje do ważnych okien aplikacji, dzięki czemu jedno okno będzie miało dostęp do innego. Sprawdza się to tylko w przypadku okien, których czas życia jest długi (okien niemodalnych). Np. dostęp do okien dokumentów: public partial class App : Application private List<Document> documents = new List<Document>(); public List<Document> Documents get return documents; set documents = value; tworzenie nowego okna dokumentu: private void newdoc_click(object sender, RoutedEventArgs e) Document doc = new Document(); doc.owner = this; doc.show(); ((App)Application.Current).Documents.Add(doc); 11/30

12/30 Window Okna Podstawowy składnik każdej aplikacji okienkowej. Dziedziczą po klasie ContentControl, co znaczy, że mogą przechowywać tylko jeden element. Najczęściej przechowują kontener (domyślnie Grid), w którym są umieszczane inne kontrolki. Obszarem klienta nazywana jest zawartość okna wewnętrzna jego część, pomijając ramkę i pasek tytułowy.

własności okien: AllowsTransparency Pozwala na przezroczystość okna, używane do okien o niestandardowym kształcie (wraz z WindowStyle na None). Icon Ustawia ikonę dla okna, widoczną na pasku tytułu i na pasku zadań. Gdy null używa ikony aplikacji (lub standardowej, jeśli ta jest niedostępna). Top i Left Określają położenie na ekranie. Zmiana odpala LocationChanged. ResizeMode Określa możliwości zmiany rozmiaru okna (NoResize blokuje zmianę rozmiaru, CanMinimize pozwala tylko minimalizować, CanResize na wszystko). RestoreBounds Określa granice okna (dostępne również po zminimalizowaniu). ShowInTaskbar Wskazuje czy okno ma być widoczne na pasku zadań, zazwyczaj true tylko dla głównego okna aplikacji. SizeToContent Umożliwia automatyczne dostosowanie wielkości okna do zawartości (również powyżej rozmiaru ekranu). Title Nazwa, która pojawi się w pasku tytułu. Topmost Okno ma być zawsze na wierzchu: umieszczane nad wszystkimi innymi oknami. WindowStartupLocation Określa startową pozycję okna: Manual (używa wartości Top i Left), CenterScreen, CenterOwner (środek okna ojca). WindowState określa stan okna: Maximized, Minimized, Normal. Zmiana odpala StateChanged. WindowStyle styl okna: wygląd krawędzi okna 13/30

14/30 Wyświetlanie okna Należy stworzyć instancję odpowiedniego okna. Okno wyświetlamy przy pomocy metod: Show() okno niemodalne ShowDialog() okno modalne // okno niemodalne MyToolBoxWindow wnd = new MyToolBoxWindow(); wnd.show(); // dalszy kod zostanie wykonany od razu po wyświetleniu okna wnd // okno modalne MyQuestionWindow dlg = new MyQuestionWindow(); dlg.showdialog(); // dalszy kod zostaje wykonany dopiero po zamknięciu okna dlg Okno modalne blokuje dostęp do okna rodzica. Typowe zastosowanie to pytanie o wybór użytkownika lub pobieranie od niego danych niezbędnych do kontynuowania akcji. zamykanie okna: metoda Close()

15/30 Interakcja między oknami: 1-do-1

16/30 public partial class Window1 : Window... DlgWindow dlg; private void ClickUpdate(...) dlg.doupdate(/* some data */); public partial class DlgWindow : Window... public void DoUpdate(/* some data */) // process data

1-do-wielu 17/30

18/30 public partial class Window1 : Window... private void ClickUpdate(...) ((App)Application.Current).UpdateAll(/* some data */); public partial class App : Application public void UpdateAll(/* some data */) foreach (Window wnd in Windows) if (wnd is DlgWindow) ((DlgWindow)wnd).DoUpdate(/* some data */); (wywołania metod DoUpdate można zastąpić własnymi zdarzeniami)

19/30 Właściciel okna Każde okno może mieć ustawionego właściciela przy wykorzystaniu własności Owner: ToolBox tools = new ToolBox(); tools.owner = this; tools.show(); Okno z Ownerem zawsze jest niemodalne. W przypadku zminimalizowania okna, minimalizowane są również wszystkie okna będące w jego posiadaniu. Podobnie jest z zamykaniem. Właściwość OwnedWindows udostępnia kolekcję okien, które są w posiadaniu danego okna.

20/30 Okna dialogowe typowy scenariusz: modalne okno dialogowe jest przeważnie pewnym wyborem wyświetlamy okno użytkownikowi i oczekujemy na wynik wyboru (lub wprowadzone dane) użytkownik dokonuje wyboru w oknie, wówczas: ustawiamy jakąś publiczną własność na rezultat wyboru zamykamy okno funkcja oczekująca na wybór wznawia działanie i: odczytuje ustawioną wartość stosownie do tego podejmuje dalsze akcje MyDialogWindow dialog = new MyDialogWindow(); dialog.mydata = "default value"; if (dialog.showdialog() == true) // wybrano OK login = dialog.mydata; else // wybrano Anuluj

21/30 ShowDialog zwraca wartość ustawioną jako DialogResult public partial class MyDialogWindow : Window public string MyData get; set; private void Dlg_Loaded(object sender, RoutedEventArgs e) // wpisanie wartości początkowej txtbox.text = MyData; private void OK_Click(object sender, RoutedEventArgs e) // odczytanie wartości użytkownika MyData = txtbox.text; DialogResult = true; Close();

W wypadku okna niemodalnego podobne zadanie realizowane jest inaczej: DlgWindow2 dialog = new DlgWindow2(); dialog.mydata = "default value"; dialog.show(); // nie czekamy na zamknięcie public partial class DlgWindow2 : Window public string MyData get; set; private void Dlg_Loaded(...) dane.text = MyData; private void Close_Click(...) Close(); private void dane_textchanged(...) Application.Current.MainWindow.Process(txtBox.Text); 22/30

23/30 Common Dialog Boxes MessageBox MessageBox.Show("Podano nieprawidłowe hasło.", "Błędne hasło", MessageBoxButton.OK, MessageBoxImage.Error); MessageBoxButton.OK MessageBoxButton.OKCancel MessageBoxButton.YesNo MessageBoxButton.YesNoCancel MessageBoxImage.Error MessageBoxImage.Warning MessageBoxImage.Information MessageBoxImage.Question

24/30 Microsoft.Win32.OpenFileDialog i SaveFileDialog OpenFileDialog mydialog = new OpenFileDialog(); mydialog.filter = "Image Files(*.BMP;*.JPG;*.GIF) *.BMP;*.JPG;*.GIF" + " All files (*.*) *.*"; mydialog.checkfileexists = true; mydialog.multiselect = true; if (mydialog.showdialog() == true) //... foreach (string file in mydialog.filenames) //...

25/30 Okna o niestandardowym kształcie Aby utworzyć okno o niestandardowym kształcie, należy: Ustawić Window.AllowsTransparency na true Ustawić Window.WindowStyle na None (ukrywa pasek tytułowy i ramkę) Ustawić tło na przezroczyste (używając przezroczystego koloru) lub na obrazek, który zawiera przezroczyste obszary Niestandardowy kształt możemy zdefiniować: przy pomocy obrazka tła zawierającego przezroczyste obszary narysować przy pomocy kształtów WPF wykorzystać element o odpowiednim kształcie, np. Border

<Window... WindowStyle="None" AllowsTransparency="True" Background="Transparent" FontSize="20"... > <Border BorderThickness="5" CornerRadius="0,20,200,20" BorderBrush="Brown" Background="LightYellow" MouseLeftButtonDown="Border_MouseLeftButtonDown"> <WrapPanel Margin="5"> <Label Margin="5" Padding="5">I'm special</label> <Button Margin="5" Click="Close_Click" Padding="15,5">Close</Button> </WrapPanel> </Border> </Window> przemieszczanie okien automatyczne: wystarczy uruchomić przeciąganie po naciśnięciu przycisku myszy (na powierzchni okna lub pewnym jego elemencie) private void Border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) this.dragmove(); 26/30

27/30

28/30 Jak powiększać okno o nietypowym kształcie? najłatwiej jest dodać jakiś element na brzegu okna z jednej strony zadba on o zmianę kursora z drugiej posłuży jako uchwyt, za który możemy złapać zmiana rozmiaru to zwykłe ustawienie własności Width/ Height <Border...> <Grid> <WrapPanel Margin="5">... </WrapPanel> <Ellipse Height="20" Width="20" Margin="0,0,46,46" HorizontalAlignment="Right" VerticalAlignment="Bottom" Stroke="DarkGreen" StrokeThickness="3" Fill="LawnGreen" Cursor="ScrollSE" MouseMove="Resize_MouseMove" MouseLeftButtonDown="Resize_MouseLeftButtonDown" MouseLeftButtonUp="Resize_MouseLeftButtonUp"/> </Grid> </Border>

29/30

30/30 obsługa: private bool resizing = false; private void Resize_MouseLeftButtonDown(...) resizing = true; private void Resize_MouseMove(...) if (resizing) ((UIElement)e.Source).CaptureMouse(); Width = e.getposition(this).x; Height = e.getposition(this).y; private void Resize_MouseLeftButtonUp(...) resizing = false; Mouse.Capture(null);