Programowanie Lokalnych Aplikacji .NET Architektura
Prymityw aplikacji WIN32 .NET
Architektura aplikacji win32
Organizacja przetwarzania komunikatów while( 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
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
Komunikat Reprezentowany przez ID Dodatkowe parametry: word long Oprócz powyższych informacji funkcja obsługi okna otrzymuje dodatkowo uchwyt okna – dlaczego ?
Komunikaty Rodzaje komunikatów zdarzenia I/O zdarzenia systemowe polecenia 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)
Przykładowe komunikaty WM_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()
Ź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.
Okno w systemie Dualizm okien systemowa 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);
CLI definicja platform wykonawczych implementowan przez CLR – 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
.NET – środowisko wykonawcze CLR 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
.Net: rozwój .NET Framework 1.0 (VS 2002) .NET Framework 1.1 (VS 2003)
.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
.NET – środowisko wykonawcze App1.exe App2.exe Dll1.dll Dll2.dll Sterta Sterta Pula watków Pula watków CLR 2.0 CLR 4.0 Natywny System Operacyjny
.NET – środowisko wykonawcze Kod zarządzalny - Managed Code Common Lnguage Routine Obudowa istniejących usług Nowe usługi Win32
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#
Interfejs Użytkownika WindowForms – 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
.Net: Okna dialogowe Użycie okienka dialogowego: ShowModal() - modalnie Show() – niemodalnie Automatycznie tworzone są składniki (atrybuty) zwiazane z kontrolkami systemowymi
.NET - lektura MSDN Hierarchia namespaces Mapa Api -> .NET class library: http://msdn.microsoft.com/library/default.a sp?url=/library/en- us/dndotnet/html/win32map.asp
Narzędzia SPY++ ILDASM.EXE REFLECTOR, DotPeek UISPY R# FXCop DEPENDENCY WALKER
Programowanie Lokalnych Aplikacji .NET WPF
WPF alternatywa dla Window Form Rezygnacja 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
WPF architektura
WPF sposoby realizacji aplikacji Kod – 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.
Xaml pozwala definiować obiekty i ustawiać ich właściwości został zaprojektowny dla wygodnej pracy z WPF
XAML Struktura: Code behind: Zagnieżdżanie elementów: <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > ... </Page> Code behind: <Window x:Class="WindowsApplication1.Window1" Zagnieżdżanie elementów: <Button> <Image Source="c:\windows\Blue Lace 16.bmp"/> </Button>
Narzędzia XAMLPAD, XAMLPAD+ VS2008, VS2010 Expression Blend
Pozycjonowanie elementów Canvas: 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.
<DockPanel> <TextBox DockPanel.Dock="Top">Dock = "Top"</TextBox> <TextBox DockPanel.Dock="Bottom">Dock = "Bottom"</TextBox> <TextBox DockPanel.Dock="Left">Dock = "Left"</TextBox> <TextBox Background="White">This TextBox "fills" the remaining space.</TextBox> </DockPanel>
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.
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.
WPF kontrolki WPF 4 – Calendar, DataPicker kontrolki można zagnieżdzać: ListBoxItem, ComboBoxItem mogą zawierać niemal dowolne elementy możliwe jest zdefinowanie wyglądu danych – (dataTemplates)
Data Binding
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
Definiowanie Bindingu Definicja programowa: Binding myBinding = new Binding("MyDataProperty"); myBinding.Source = myDataObject; myText.SetBinding(TextBlock.TextProperty, myBinding);
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.
Definiowanie Bindingu Xaml-1 <TextBox Text = "{Binding Source=Application.Current, Path=myAppProperty}" /> Lub <TextBox> <TextBox.Text> <Binding Source="Application.Current” Path=" myAppProperty" /> </TextBox.Text> </TextBox> 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
Definiowanie Bindingu Xaml-2 < TextBox Text = "{Binding ElementName=ControlABC, Path=ColorName}" /> <ListBox ItemsSource="{Binding Source= {StaticResource myDataSource}}” <StackPanel DataContext= {StaticResource myDataSource}}" <ListBox ItemsSource="{Binding}" /> <TextBox Text="{Binding Path=/Name}" /> </StackPanel> 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
Definiowanie Zasobów </DataTemplate> <Window.Resources> <CollectionViewSource Source="{Binding Source={x:Static Application.Current}, Path=Games}" x:Key=" myDataSource" /> <DataTemplate x:Key="myDateTemplate"> <TextBlock Text="{Binding Path=Title}“ Foreground="Navy" FontWeight="Bold" FontSize="12"/> </DataTemplate> </Window.Resources> ź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
Szablon Pozwala określić sposób wyświetlania obiektu Szablon to foremka do produkcji zestawów kontrolek zbindowanych do danych Szablon moze byc Aplikowany do konkretnej kontrolki Domyslny dla typu danych <ListBox ItemsSource="{Binding Source= {StaticResource myDataSource}}" ItemTemplate="{StaticResource myDateTemplate}" /> X:Key nzawa elementu Current zwraca biezacy obiekt App:Application Statyczne zasoby moga zawierac rozne elementy w tym rowniez zrodla w bindingu to o
brak Data template namespace WPF_Test { public class River public string Name { get; set; } public int MilesLong { get; set; } } <StackPanel> <StackPanel.Resources> <local:River x:Key="theRiver" Name="Colorado River" MilesLong="1450"/> </StackPanel.Resources> <ContentControl Content="{StaticResource theRiver }" /> </StackPanel>
zdefiniowany Data template <DataTemplate DataType="{x:Type local:River}"> <Border BorderBrush="Blue" BorderThickness="3" CornerRadius="12"> <Grid Margin="4"> <TextBlock> <Run Text="The"/> <TextBlock Text="{Binding Name}"/> <Run Text="is"/> <TextBlock Text="{Binding MilesLong}" /> <Run Text="miles long." /> </TextBlock> </Grid> </Border> </DataTemplate>
WPF Dependancy properties Jeż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.)
WPF Data context elementy w WPF mają właściwość DataContext jeż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
Binding - źródla danych obiekty CLR obiekty użytkownika kolekcje XML ADO Nie można bindować do pól (do właściwości jak najbardziej)
Przepływ danych w Bindingu OneWay TwoWay OneWayToSource
Wyzwalanie aktualizacji w Bindingu
Binding - konwersje "{Binding Path=TheDate, Converter={StaticResource MyConverterReference}}"
WPF binding - konwertery public 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" ); } }
WPF binding – konwertery wielowartościowe public 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" );
WPF binding – konwertery wielowartościowe <Rectangle.Width> <MultiBinding Converter="{StaticResource SumatorConverter }"> <Binding ElementName= "man" Path= "Incomes" /> <Binding ElementName= "woman" Path= "Incomes" /> </MultiBinding> </Rectangle.Width>
Binding – walidacja Przebieg bindingu Uruchamiane 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).
Binding – dignostyka PresentationTraceSources.SetTraceLevel Lub <TextBox> <TextBox.Text> <Binding Source="{StaticResource myDataSource}" Path="PersonName" diag:PresentationTraceSources.TraceLevel="High"/> </TextBox.Text> </TextBox>
Użycie konwertera do inicjacji debugowania public 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) {
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 <DataTemplate x:Key="myDetailTemplate"> ... <TextBlock Text="{Binding Path=IsAvailiable, Converter={StaticResource boolYNConverter}}"/> </DataTemplate>
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;
Formatowanie ? Podejście drugie – specjalizowany binding <DataTemplate x:Key="myDetailTemplate"> ... <TextBlock Text="{src:BoolBindingExtension Status.WantToPlay, Yes, No }"/> </DataTemplate>
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 {...}
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;
Podejście trzecie : biblioteka Kent.Boogaart.Converters <TextBlock> <TextBlock.Text> <Binding Path="Status.WantToPlay"> <Binding.Converter> <con:MapConverter> <con:Mapping To="YES" > <con:Mapping.From> <System:Boolean>True</System:Boolean> </con:Mapping.From> </con:Mapping> <con:Mapping To="NO" > <System:Boolean>False</System:Boolean> </con:MapConverter> </Binding.Converter> </Binding> </TextBlock.Text> </TextBlock> Podejście trzecie : biblioteka Kent.Boogaart.Converters
Style <Style TargetType="{x:Type Button}"> <Setter Property="Background" Value="Yellow" /> </Style> definicja xaml programowa w kodzie
Triggery trigger jest odpowiednikiem "if" – w kodzie proceduralnym <Trigger SourceName="bdr" Property="IsMouseOver" Value="True"> <Setter TargetName="bdr" Property="Background" Value="LightGray"/> <Setter TargetName="txt" Property="Foreground" Value="Red"/> </Trigger> trigger oparty na wielu wartościach <MultiDataTrigger.Conditions> <Condition Binding="{Binding IsFinished}" Value="True" /> <Condition Binding="{Binding IsWinner}" Value="False" /> </MultiDataTrigger.Conditions> , Path=""
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
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
WPF Geometria 2d/3d Viewport3D Współrzedne przestrzeni 3D
WPF elementy sceny kamery, modele, siatki, materiały
WPF Konstrukcja sceny <Viewport3D > <Viewport3D.Camera> <PerspectiveCamera Position="-3,1,8" LookDirection="3,-1,-8" UpDirection="0,1,0" FieldOfView="45" NearPlaneDistance="0.15" /> </Viewport3D.Camera> <ModelVisual3D> <ModelVisual3D.Content> <Model3DGroup > </Model3DGroup > </ModelVisual3D.Content> </ModelVisual3D> </Viewport3D >
WPF Grupa 3D <GeometryModel3D> <GeometryModel3D.Geometry> <MeshGeometry3D 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" /> </GeometryModel3D.Geometry> <GeometryModel3D.Material> <DiffuseMaterial Brush="Aqua" /> </GeometryModel3D.Material> </GeometryModel3D>
WPF Swiatła <Model3DGroup> <Model3DGroup.Children> <AmbientLight Color="#ffcccccc"/> <DirectionalLight Color="LightGray" Direction="-1,-1,-1" /> </Model3DGroup.Children> </Model3DGroup>
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
WPF elementy sceny perspektywa – rzecz kamery
WPF Materiały DiffuseMaterial – materiał rozpraszający SpecularMaterial – materiał odblaskowy EmmisiveMaterial – materiał emisyjny tekstury
Linki WPF 3DPanel: Przykład – panel3d Josh Smith http://www.codeproject.com/KB/WPF/panel3d.aspx WPF vs grafika, animacje: http://msdn.microsoft.com/en-us/library/ms742562.aspx
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 http://msdn.microsoft.com/en-us/magazine/cc785480.aspx
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.
WPF handler zdarzenia Zwykły handler zdefiniowany w elemencie <Button Name="myButton" Click="myButton_Click"> Test Button </Button> Handler zdefinowany na zewnatrz elementu (attached event) <Grid Button.Click="myButton_Click"> <Button Name="myButton" >Click Me</Button> </Grid>
WPF obsługa zdarzenia Obsłużenie zdarzenia private 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);
Routed + Command = RoutedCommand WPF 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) http://msdn.microsoft.com/en-us/magazine/cc785480.aspx http://www.codeproject.com/Articles/28093/Using-RoutedCommands-with-a-ViewModel-in-WPF
WPF definiowanie komendy <Button Command="Save">Save</Button> <Button Command="Save" CommandTarget="{Binding ElementName=uc1}" Width="75" Height="25">Save</Button>
Renderowanie Layoutu Drzewo logiczne vs. Drzewo widoków Wymiarowanie 2 fazy: Measure i Align HorizontalAlignment = Left, ...,Stretch Grid.Row,Grid.RowSpan Width, ActualWidth RowDefinition Height= "Auto", "*", "1“ http://msdn.microsoft.com/en-us/library/ms745058.aspx#LayoutSystem_Measure_Arrange
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}" http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/sample-data-in-the-wpf-and-silverlight-designer.aspx
WPF Dokumenty DocumentViewer FlowDocumentReader, FlowDocumentPageViewer, FlowDocumentScrollViewer XML Paper Specification (XPS) Więcej tu http://msdn.microsoft.com/en-us/library/ms749165.aspx
WPF Typografia Skalowanie (urzadzenia mobilne) Wykorzystanie ClearType Duże usprawnienia w wersji 4.0 Więcej tu http://msdn.microsoft.com/en-us/library/ms742190.aspx
WPF vs WinForms http://blogs.msdn.com/b/scoberry/archive/2006/09/01/735844.aspx http://www.simple-talk.com/dotnet/.net-framework/mixing-wpf-and-winforms/
WPF wielowątkowość wydzielony wątek do renderowania formy Dostęp z innego wątku Window1 win = (Window1) state; for (int i = 0; i < 100; i++) { win.Dispatcher.Invoke(new Action<ProgressBar, int>( (p, v) => p.Value = v), win.progress1, i); } http://msdn.microsoft.com/en-us/library/ms741870.aspx
WPF - źródła http://joshsmithonwpf.wordpress.com/a-guided-tour-of-wpf/ http://www.codeproject.com/KB/WPF/VMCommanding.aspx http://msdn.microsoft.com/en-us/library/ms754130.aspx http://www.wpf-tutorial.com/ http://www.wpftutorial.net/ http://www.wpfpedia.com/ Ksiązki: “WPF 4 Unleashed”, Adam Nathan “Advanced MVVM”, Josh Smith