Programowanie Lokalnych Aplikacji .NET

1 Programowanie Lokalnych Aplikacji .NETArchitektura ...
Author: Joasia Chmielnicki
0 downloads 2 Views

1 Programowanie Lokalnych Aplikacji .NETArchitektura

2 Prymityw aplikacji WIN32 .NET

3 Architektura aplikacji win32

4 Organizacja przetwarzania komunikatówwhile( GetMessage( &msg, NULL, 0, 0 ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } GetMessage() – pobiera komunikat z kolejki TranslateMessage() – umożliwia systemowi lub funkcjom użytkownika przekształcenie niektórych komunikatów z klawiatury DispatchMessage() – inicjuje przekazanie komunikatu jako parametru odpowiedniego wołania funkcji obsługi okna PeekMessage() – pozwala sprawdzić czy jest jakiś komunikat w kolejce

5 LRESULT CALLBACK MainWndProc( HWND hWnd, UINT msg,LRESULT CALLBACK MainWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { PAINTSTRUCT ps; HDC hDC; switch( msg ) { OBSŁUGA_KOMUNIKATÓW case WM_DESTROY: PostQuitMessage( 0 ); break; default: return DefWindowProc( hWnd, msg, wParam, lParam ); } return 0; FUNKCJA OBSŁUGI OKNA

6 Komunikat Reprezentowany przez ID Dodatkowe parametry: word longOprócz powyższych informacji funkcja obsługi okna otrzymuje dodatkowo uchwyt okna – dlaczego ?

7 Komunikaty Rodzaje komunikatów zdarzenia I/O zdarzenia systemowepolecenia użytkownika/prywatne komunikaty aplikacji Komunikat może być umieszczony w kolejce związanej z aplikacją dostarczony z pominięciem kolejki – bezpośrednie wywołanie funkcji obsługi okna przez system (z komunikatem jako parametrem)

8 Przykładowe komunikatyWM_PAINT – wymusza przerysowanie obszaru roboczego (lub jego fragmentu) WM_DESTROY – zniszczenie okna zwykle kończy całą aplikację przez wysłanie WM_QUIT WM_RBUTTONDOWN – komunikat o zachowaniu (zmianie stanu) myszy WM_COMMAND – komenda systemowa. Jej typ jest określony przez dodatkowe dane wParam. WM_QUIT wysyłany przez PostQuitMessage() kończy główna pętlę zdarzeń Nieobsłużone komunikaty przekazywane są do systemu -> DefWindowProc()

9 Źródła komunikatów Kolejkowanych aplikacja PostMessage()klawiatura np.: WM_KEYDOWN mysz np.:WM_LBUTTONDOWN zdarzenia związane z GUI np.: WM_PAINT zdarzenia systemowe np.: WM_QUIT, WM_TIMER Niekolejkowanych aplikacja SendMessage() WM_ACTIVATE, WM_SETFOCUS, and WM_SETCURSOR.

10 Okno w systemie Dualizm okiensystemowa struktura odzwierciedlająca obiekt graficzny prezentowany (lub nie) na ekranie struktura danych kontrolowana przez programistę pozwalająca wpływać na okna [DllImport("user32.dll", CharSet = CharSet.Auto)] static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

11 CLI definicja platform wykonawczych implementowan przezCLR – MS .NET Framework ROTOR – Shared Source CLI CF - MS .NET Compact Framework (PDA/Smartphones) MS .NET Micro Framework Core CLR, DLR (Silverlight, IronPython) Mono DotGnu Portable.NET

12 .NET – środowisko wykonawczeCLR Obsługa wersjonowania komponentów Unifikacja modeli danych, bibliotek Definiowalny hierarchiczny system zabezpieczeń Kompatybilność z COM/COM+ Zarządzanie pamięcią, garbage colector Hierarchiczny układ funkcjonalności udostępnianiej przez system

13 .Net: rozwój .NET Framework 1.0 (VS 2002) .NET Framework 1.1 (VS 2003)

14 .NET – kod wykonywalny Kod źródłowy VB, C#, VC (?), COBOL, Native JITC... Microsoft Intermediate Language JITC Native Code Kompilatory języków ngen.exe

15 .NET – środowisko wykonawczeApp1.exe App2.exe Dll1.dll Dll2.dll Sterta Sterta Pula watków Pula watków CLR 2.0 CLR 4.0 Natywny System Operacyjny

16 .NET – środowisko wykonawczeKod zarządzalny - Managed Code Common Lnguage Routine Obudowa istniejących usług Nowe usługi Win32

17 PRYMITYW APLIKACJI C# using System; using System.Drawing; ......namespace WindowsApplication1 { public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.TextBox textBox1; public Form1() protected override void Dispose( bool disposing ) /* ... */ [STAThread] static void Main() { Application.Run(new Form1()); } } PRYMITYW APLIKACJI C#

18 Interfejs UżytkownikaWindowForms – klasy w dużej mierze obudowujące kontrolki Win32 WebForms – klasy przeznaczone dla aplikacji WEB (IIS) (wzorowane na WF) dynamicznie dostosowujące się np. do typu przeglądarki i dostępnych protokołów WPF(Silverlight) – nowa warstwa prezentacji wykorzystująca DirectX dostępna od .NET 3.0

19 .Net: Okna dialogowe Użycie okienka dialogowego:ShowModal() - modalnie Show() – niemodalnie Automatycznie tworzone są składniki (atrybuty) zwiazane z kontrolkami systemowymi

20 .NET - lektura MSDN Hierarchia namespacesMapa Api -> .NET class library: sp?url=/library/en- us/dndotnet/html/win32map.asp

21

22 Narzędzia SPY++ ILDASM.EXE REFLECTOR, DotPeek UISPY R# FXCopDEPENDENCY WALKER

23 Programowanie Lokalnych Aplikacji .NETWPF

24 WPF alternatywa dla Window FormRezygnacja z koncepcji opartych na win32/16 XAML – język opisujący definicję GUI wbudowany databinding definiowany na poziomie definicji zasobów rozdzielenie wyglądu od logiki uzycie hierarchicznych stylów, separacja zachowań kontrolek od wyglądu (branding) wykorzystanie sprzętowej akceleracji (oparty na DirectX) odejscie od koncepcji interfejsu opartego o stały rozmiar pixla

25 WPF architektura

26 WPF sposoby realizacji aplikacjiKod – tradycyjny sposób (analog. Do WindowForms). Aplikacja jest generowana przez tworzenie instancji odpowiednich klas w kodzie. Kod+skompilowany markup (BAML). – preferowane i jedyne wspierane przez VS pdejście. Szablony w XAML są kompilowane i włączane do assembly. Kod+nieskompilowany markup (XAML) – to podejście ma gdy potrzebny jest dynamiczny interfejs – XamlReader (System.Windows.Markup) pozwala wczytac i skompilowax XAML w czasie wykonania.

27 Xaml pozwala definiować obiekty i ustawiać ich właściwościzostał zaprojektowny dla wygodnej pracy z WPF

28 XAML Struktura: Code behind: Zagnieżdżanie elementów: ... Code behind: Zagnieżdżanie elementów:

29 Narzędzia XAMLPAD, XAMLPAD+ VS2008, VS2010 Expression Blend

30 Pozycjonowanie elementówCanvas: Child controls provide their own layout. DockPanel: Child controls are aligned to the edges of the panel. Grid: Child controls are positioned by rows and columns. StackPanel: Child controls are stacked either vertically or horizontally. VirtualizingStackPanel: Child controls are virtualized and arranged on a single line that is either horizontally or vertically oriented. WrapPanel: Child controls are positioned in left-to-right order and wrapped to the next line when there are more controls on the current line than space allows.

31 Dock = "Top" Dock = "Bottom" Dock = "Left" This TextBox "fills" the remaining space.

32 Kontrolki Buttons: Button and RepeatButton.Dialog Boxes: OpenFileDialog, PrintDialog, and SaveFileDialog. Digital Ink: InkCanvas and InkPresenter. Documents: DocumentViewer, FlowDocumentPageViewer, FlowDocumentReader, FlowDocumentScrollViewer, and StickyNoteControl. Input: TextBox, RichTextBox, and PasswordBox. User Information: AccessText, Label, Popup, ProgressBar, StatusBar, TextBlock, and ToolTip.

33 Kontrolki Layout: Border, BulletDecorator, Canvas, DockPanel, Expander, Grid, GridView, GridSplitter, GroupBox, Panel, ResizeGrip, Separator, ScrollBar, ScrollViewer, StackPanel, Thumb, Viewbox, VirtualizingStackPanel, Window, and WrapPanel. Media: Image, MediaElement, and SoundPlayerAction. Menus: ContextMenu, Menu, and ToolBar. Navigation: Frame, Hyperlink, Page, NavigationWindow, and TabControl. Selection: CheckBox, ComboBox, ListBox, TreeView, and RadioButton, Slider.

34 WPF kontrolki WPF 4 – Calendar, DataPickerkontrolki można zagnieżdzać: ListBoxItem, ComboBoxItem mogą zawierać niemal dowolne elementy możliwe jest zdefinowanie wyglądu danych – (dataTemplates)

35 Data Binding

36 Binding Możliwy jest binding do kontrolek, xmla, obiektów, elementów spoza okna Dzieki bindingowi możliwa jest budowa bardzo cienkiego UI – cały kod definiujący wygląd jest w takim wypadku wyniesiony z kontrolera/prezentera co b. dobrze współgra z Testami Jednostkowymi

37 Definiowanie BindinguDefinicja programowa: Binding myBinding = new Binding("MyDataProperty"); myBinding.Source = myDataObject; myText.SetBinding(TextBlock.TextProperty, myBinding);

38 WPF binding - elementy Source - domyślnie wskazuje na DataContekst (może być odziedziczone po poprzedniku). po ustawieniu source na wrtość != null operacje bindingu traktują s. jako miejsce z ktorego pobierać/w którym skladać dane. Path – pozwala określić property obiektu źródłowego (typu PropertyPath). ElementName – może być użyte jako alternatywna nazwa dla Source – pozwala określić nazwę elementu używanego jako źródło danych. Converter – (typu IValueConverter) – może zostać zainicjowane instancją obiektu konwerującego dane.

39 Definiowanie Bindingu Xaml-1 /> Lub Element name odnosi sie do wlasciwosci Name="ControlABC„ Binding do wlasciwosci Pusty binding oznacza bindindg do odziedziczonego elementu Statyczne zasoby moga zawierac rozne elementy w tym rowniez zrodla w bindingu to o Dziedziczonego bindingu/zdefiniowanego w zasobach mozna dodawac path

40 Definiowanie Bindingu Xaml-2< TextBox Text = "{Binding ElementName=ControlABC, Path=ColorName}" /> Element name odnosi sie do wlasciwosci Name="ControlABC„ Binding do wlasciwosci Pusty binding oznacza bindindg do odziedziczonego elementu Statyczne zasoby moga zawierac rozne elementy w tym rowniez zrodla w bindingu to o Dziedziczonego bindingu/zdefiniowanego w zasobach mozna dodawac path

41 Definiowanie Zasobów x:Key=" myDataSource" /> FontWeight="Bold" FontSize="12"/> źródło X:Key nzawa elementu Current zwraca biezacy obiekt App:Application Statyczne zasoby moga zawierac rozne elementy w tym rowniez zrodla w bindingu to o szablon

42 Szablon Pozwala określić sposób wyświetlania obiektuSzablon to foremka do produkcji zestawów kontrolek zbindowanych do danych Szablon moze byc Aplikowany do konkretnej kontrolki Domyslny dla typu danych /> X:Key nzawa elementu Current zwraca biezacy obiekt App:Application Statyczne zasoby moga zawierac rozne elementy w tym rowniez zrodla w bindingu to o

43 brak Data template namespace WPF_Test { public class Riverpublic string Name { get; set; } public int MilesLong { get; set; } }

44 zdefiniowany Data template

45 WPF Dependancy propertiesJeżeli obiekt nie ma zdefiniowanej dziedziczonej właściwości – wtedy używana jest wartość z elementu nadrzędnego (rodzica w drzewie). Uwaga! drzewo oznacza drzewo obiektów (np. kontrolek) a nie klas - analogicznie do ambient properties w Window Forms Można je ustawiać z poziomu XAML (jak zwykłe p.)

46 WPF Data context elementy w WPF mają właściwość DataContextjeżeli zostanie ona ustawiona na jakiś obiekt wszystkie elementy pochodne (dzieci w drzewie obiektów) przejmują (dziedziczą) tą wartość chyba, że explicite określimy inaczej Można w ten sposób określić binding dla całego drzewa obiektów

47 Binding - źródla danychobiekty CLR obiekty użytkownika kolekcje XML ADO Nie można bindować do pól (do właściwości jak najbardziej)

48 Przepływ danych w BindinguOneWay TwoWay OneWayToSource

49 Wyzwalanie aktualizacji w Bindingu

50 Binding - konwersje "{Binding Path=TheDate, Converter={StaticResource MyConverterReference}}"

51 WPF binding - konwerterypublic class DoubleToIntegerConverter : IValueConverter { public object Convert( object value, Type targetType, object parameter, CultureInfo culture ) { return (int)(double)value; } public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture ) { throw new NotSupportedException( "Cannot convert back" ); } }

52 WPF binding – konwertery wielowartościowepublic class SumatorConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture ) int s1 = (int)values[1]; int s2 = (int)values[2]; return s1+s2; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture ) { throw new NotSupportedException( "Cannot convert back" );

53 WPF binding – konwertery wielowartościowe

54 Binding – walidacja Przebieg bindinguUruchamiane są (jeżeli są) indywidualne reguły walidacji (do pierwszego błędu) dla wartości pierwotnych (ValidationStep ustawiony na RawProposedValue) Uruchamiany jest konwerter (jeżeli istnieje), ew. błedy (wyjątki) przerywają proces Uruchamiane są (jeżeli są) indywidualne reguły walidacji (do pierwszego błędu) dla wartości wynikowych (ValidationStep ustawiony na ConvertedProposedValue) Ustawiana jest wartość wynikowa Uruchamiane są (jeżeli są) indywidualne reguły walidacji (do pierwszego błędu) dla wartości zaktualizowanych (ValidationStep ustawiony na UpdatedValue lub CommittedValue) Ew. błąd jest dodawany do kolekcji Validation.Errors skojarzonej z elementem (jest ona czyszczona przed p. 1).

55 Binding – dignostyka PresentationTraceSources.SetTraceLevel Lub

56 Użycie konwertera do inicjacji debugowaniapublic class DatabindingDebugConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { Debugger.Break(); return value; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {

57 Formatowanie ? Dla potrzeb formatowania danych w szablonie można wykorzystać konweretery Przykład jak spowodować żeby wartość bool była wyświetlana jako tak/nie Podejście pierwsze: specjalizowany konwerter ...

58 Formatowanie vs konwersja?[ValueConversion(typeof(bool), typeof(String))] public class BoolYesNoConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return (bool)value ? "yes" : "no"; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) return null;

59 Formatowanie ? Podejście drugie – specjalizowany binding ...

60 public class BoolBindingExtension : Binding{ public BoolBindingExtension() { Initialize(); } public BoolBindingExtension(string path) : base(path) { Initialize(); } public BoolBindingExtension(string path, object valueIfTrue, object valueIfFalse) : base(path) Initialize(); ValueIfTrue = valueIfTrue; ValueIfFalse = valueIfFalse; } private void Initialize() ValueIfTrue = DoNothing; ValueIfFalse = DoNothing; Converter = new BoolConverter(this); [ConstructorArgument("valueIfTrue")] public object ValueIfTrue { get; set; } [ConstructorArgument("valueIfFalse")] public object ValueIfFalse { get; set; } private class BoolConverter : IValueConverter {...}

61 private class BoolConverter : IValueConverter{ public BoolConverter(BoolBindingExtension boolExtension) { _bool = boolExtension; } private BoolBindingExtension _bool; public object Convert(object value, Type targetType, object parameter, CultureInfo culture) try bool b = System.Convert.ToBoolean(value); return b ? _bool.ValueIfTrue : _bool.ValueIfFalse; } catch return DependencyProperty.UnsetValue; public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) return DoNothing;

62 Podejście trzecie : biblioteka Kent.Boogaart.Converters True False Podejście trzecie : biblioteka Kent.Boogaart.Converters

63 Style definicja xaml programowa w kodzie

64 Triggery trigger jest odpowiednikiem "if" – w kodzie proceduralnym trigger oparty na wielu wartościach , Path=""

65 Kolekcje vs. Binding Źródło odpowiada nie tylko za listę elementów ale równiez za wskaźnik bieżącego elementu (Path=/), na źródło mozna nakładac filtry, grupować elementy, sortować Scenariusz: master – detail Dla obiektów Ado aby sortowanie dlegowac do obiektu ado trzeba stosować kolekcji mozliwe obiekty CLR obiekty użytkownika kolekcje XML ADO

66 WPF Animacje Polega na zmianie wskazanej właściwości okreslonego obiektu w zadanym rytmie Typy animacji: from/to/by: ColorAnimation, DoubleAnimation, PointAnimation key-frames: ColorAnimationUsingKeyFrames, DoubleAnimationUsingKeyFrames, PointAnimationUsingKeyFrames, StringAnimationUsingKeyFrames path: DoubleAnimationUsingPath, PointAnimationUsingPath

67 WPF Geometria 2d/3d Viewport3D Współrzedne przestrzeni 3D

68 WPF elementy sceny kamery, modele, siatki, materiały

69 WPF Konstrukcja sceny UpDirection="0,1,0" FieldOfView="45" NearPlaneDistance="0.15" />

70 WPF Grupa 3D Positions="0,1,0 1,-1,1 -1,-1,1 1,-1,1 -1,-1,-1" Normals="0,1,0 -1,0,1 1,0,1 -1,0,-1 1,0,-1" TriangleIndices="0,2,1 0,3,1 0,3,4 0,2,4" />

71 WPF Swiatła

72 WPF światła AmbientLight – światło otoczenia. Jego jedynym parametrem jest Color. DirectionalLight – światło kierunkowe. Posiada kolor oraz kierunek określony parametrem Direction, w jakim padają jego promienie. PointLight – światło punktowe. Parametry Position, Range(dł. fali), zmiana intensywności - (ConstantAttenuation,LinearAttenuation, QuadraticAttenuation). SpotLight – światło punktowo-kierunkowe. Parametry stożka: Position, Direction, InnerConeAngle,OuterConeAngle + wł. dla PointLight

73 WPF elementy sceny perspektywa – rzecz kamery 

74 WPF Materiały DiffuseMaterial – materiał rozpraszającySpecularMaterial – materiał odblaskowy EmmisiveMaterial – materiał emisyjny tekstury

75 Linki WPF 3DPanel: Przykład – panel3d Josh Smith WPF vs grafika, animacje:

76 WPF input events ... zdefiniowane jako pary są implementowane tak że pojedyncza akcja np. kliknięcie myszą wywołuje dwa po sobie nastepujące zdarzenia tunneling bubble Oba zdarzenia współdzielą dokładnie tą samą instancję danych opisujących zdarzenie. Stąd zdarzenie może zostać obsłużone nie przez element, w którym miało miejsce

77 WPF routed events Bubbling: wołany jest event handler w el. źródłowym a potem kolejno w rodzicach. Direct: Tylko żródłowy element woła handler Tunneling: handlery wołane są od roota do źródła PreviewMouseDown (tunnel) on root element. PreviewMouseDown (tunnel) on intermediate element #1. PreviewMouseDown (tunnel) on source element #2. MouseDown (bubble) on source element #2. MouseDown (bubble) on intermediate element #1. MouseDown (bubble) on root element.

78 WPF handler zdarzenia Zwykły handler zdefiniowany w elemencie Handler zdefinowany na zewnatrz elementu (attached event)

79 WPF obsługa zdarzenia Obsłużenie zdarzeniaprivate void OnMyElementMouseDown(object sender, MouseButtonEventArgs e) { e.Handled = true; } Handler wołany zawsze (nawet dla z. obsłużonych) m_myElement.AddHandler(UIElement.MouseDownEvent, (RoutedEventHandler)OnMouseDownMyHandler,true);

80 Routed + Command = RoutedCommandWPF RoutedCommand Routed + Command = RoutedCommand Routted command vs „klasyczna” obsługa możliwość uruchamiania zdarzenia przez wiele źródeł (bez definiowania h. w kodzie) blokowanie wszystkich źródeł jednocześnie i automatycznie (->CommandManager) mozliwość oddzielenie kodu od samej formy (MVC)

81 WPF definiowanie komendy

82 Renderowanie Layoutu Drzewo logiczne vs. Drzewo widoków Wymiarowanie2 fazy: Measure i Align HorizontalAlignment = Left, ...,Stretch Grid.Row,Grid.RowSpan Width, ActualWidth RowDefinition Height= "Auto", "*", "1“

83 Dane dla designera xmlns:d="http://schemas.microsoft.com/expression/blend/2008" ... public MyData { get { return new Person() { Name = "Harry" }; } } d:DataContext="{Binding RelativeSource= {RelativeSource Self}, Path=MyData}"

84 WPF Dokumenty DocumentViewerFlowDocumentReader, FlowDocumentPageViewer, FlowDocumentScrollViewer XML Paper Specification (XPS) Więcej tu

85 WPF Typografia Skalowanie (urzadzenia mobilne) Wykorzystanie ClearTypeDuże usprawnienia w wersji 4.0 Więcej tu

86 WPF vs WinForms

87 WPF wielowątkowość wydzielony wątek do renderowania formyDostęp z innego wątku Window1 win = (Window1) state; for (int i = 0; i < 100; i++) { win.Dispatcher.Invoke(new Action( (p, v) => p.Value = v), win.progress1, i); }

88 WPF - źródła http://joshsmithonwpf.wordpress.com/a-guided-tour-of-wpf/ Ksiązki: “WPF 4 Unleashed”, Adam Nathan “Advanced MVVM”, Josh Smith