Programowanie w środowisku Windows

Download Report

Transcript Programowanie w środowisku Windows

Programowanie
Lokalnych Aplikacji
.NET
Architektura
Prymityw
WIN32
.NET
aplikacji
Architektura aplikacji win32
inicjalizacja
funkcja
obsługi
okna
pętla
główna
kolejka komunikatów
WM_QUIT
zakończenie
Organizacja przetwarzania
while( GetMessage( &msg, NULL, 0, 0 ) )
komunikatów
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
{
FUNKCJA OBSŁUGI OKNA
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;
}
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 implementowana przez
 CLR – MS .NET Framework


CF - MS .NET Compact Framework
(PDA/Smartphones)




ROTOR – Shared Source CLI
MS .NET Micro Framework
Core CLR, DLR (Silverlight, IronPython)
Mono
DotGnu Portable.NET
CLI




Wspólny zestaw typów danych (Common Type System) –
zbiór typów danych, które są obsługiwane przez wszystkie
kompatybilne języki programowania.
Metadane – informacje o strukturze definiowanych klas,
interfejsów i innych typów, pozwalające na ich wykorzystanie w
różnych językach i narzędziach.
Wspólna specyfikacja języków (Common Language
Specification) – określa zbiór reguł, do których wszystkie języki
zgodne z CLI muszą się stosować, aby były kompatybilne z
pozostałymi językami.
Wirtualny system wykonawczy (Virtual Execution System) –
wczytuje i wykonuje programy kompatybilne z CLI, używa
metadanych w celu połączenia poszczególnych fragmentów
kodu w czasie wykonywania.
.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 Framework 2.0 (VS 2005)
 .NET Framework 3.5 (VS 2008)
 .NET Framework 4.0 (VS 2010)
 .NET Framework 4.5 (VS 2012)

Kod źródłowy
VB, C#, VC (?),
COBOL,
Microsoft
Intermediate
Language
JITC
.NET – kod wykonywalny
...
Kompilatory
języków
ngen.exe
Native
Code
.NET – środowisko wykonawcze
App1.exe
App2.exe
Dll1.dll
Dll2.dll
Sterta
Pula
watków
CLR 2.0
Sterta
Pula
watków
CLR 4.0
Natywny System Operacyjny
.NET – środowisko wykonawcze
Kod zarządzalny - Managed Code
Common
Lnguage
Routine
Obudowa
istniejących
usług
Win32
Nowe
usługi
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());
}
}
}
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/enus/dndotnet/html/win32map.asp

Postery
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:
<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+
VS_XXXX
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
 WPF 4.5 – Ribbon
 kontrolki można zagnieżdzać:
ListBoxItem, ComboBoxItem mogą
zawierać niemal dowolne elementy
 możliwe jest zdefinowanie wyglądu
danych – (dataTemplates)

Attached property
<TextBox DockPanel.Dock="Left">Dock =
"Left"</TextBox>
DockPanel myDockPanel = new DockPanel();
TextBox myTextBox = new TextBox();
myDockPanel.Children.Add(myTextBox);
DockPanel.SetDock(myTextBox, Dock.Top);
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 np. 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>
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>
Definiowanie Zasobów
<Window.Resources>
<CollectionViewSource Source="{Binding
Source={x:Static Application.Current}, Path=Games}"
źródło
x:Key=" myDataSource" />
<DataTemplate x:Key="myDateTemplate">
<TextBlock Text="{Binding Path=Title}“
Foreground="Navy"
szablon
FontWeight="Bold" FontSize="12"/>
</DataTemplate>
</Window.Resources>
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}"
/>
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)
2. Uruchamiany jest konwerter (jeżeli istnieje), ew. błedy (wyjątki)
przerywają proces
3. Uruchamiane są (jeżeli są) indywidualne reguły walidacji (do
pierwszego błędu) dla wartości wynikowych (ValidationStep
ustawiony na ConvertedProposedValue)
4. Ustawiana jest wartość wynikowa
5. 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).
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) {
Debugger.Break();
return value;
}
}
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)
{
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 {...}
}
: base(path)
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" >
<con:Mapping.From>
<System:Boolean>False</System:Boolean>
</con:Mapping.From>
</con:Mapping>
</con:MapConverter>
</Binding.Converter>
</Binding>
</TextBlock.Text>
</TextBlock>
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"/>
, Path=""
</Trigger>

trigger oparty na wielu wartościach
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding IsFinished}" Value="True" />
<Condition Binding="{Binding IsWinner}" Value="False" />
</MultiDataTrigger.Conditions>
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/enus/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);

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/UsingRoutedCommands-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





RowDefinition Height=


2 fazy: Measure i Align
HorizontalAlignment = Left, ...,Stretch
Grid.Row,Grid.RowSpan
Width, ActualWidth
"Auto", "*", "1“
http://msdn.microsoft.com/enus/library/ms745058.aspx#LayoutSystem_Meas
ure_Arrange
Dane dla designera
xmlns:d="http://schemas.microsoft.com/expression/blend/2
008"
...
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-andwinforms/
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-ofwpf/
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.5 Unleashed”, Adam Nathan
 “Advanced MVVM”, Josh Smith