WINDOWS PRESENTATION FOUNDATION platforma tworzenia aplikacji okienkowych z bogatą warstwą prezentacji (.NET 3.0 ) rozdzielenie warstwy prezentacji (język XAML) i warstwy interakcji (język C# ) możliwe przejście do aplikacji pobieranej z serwera internetowego i osadzanej w przeglądarce (XBAP - XAML Browser Application) A. Troelsen, Pro C# 2010 and the.NET 4 Platform, APRESS, 2010 M. MacDonald, Pro WPF in C# 2010: Windows Presentation Foundation in.NET 4.0, APRESS, 2010
podstawowe cechy –– rozbudowane możliwości kształtowania wyglądu i stylu okien ( szablony, czcionki ) –– wiązania danych –– obsługa grafiki 2D i 3D (grafika wektorowa) oraz animacji –– obsługa dokumentów –– współpraca z Windows Forms
podstawowe klasy –– Visual : generacja obrazu okna –– DispatcherObject : obsługa wątków –– Control : klasa bazowa elementów sterujących –– Application : nadzorowanie cyklu życia aplikacji inne główne klasy –– UIElement –– FrameworkElement –– ContentElement –– FrameworkContentElement
przestrzenie nazw using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Media; using System.Windows.Navigation; using System.Windows.Shapes; FirstWPF
język XAML Extensible Application Markup Language –– dialekt XML –– opis warstwy prezentacji program w języku XAML jest tłumaczony na BAML ( Binary Application Markup Language ) język XAML jest używany w innych narzędziach Expression Design ; Expression Blend ; Kaxaml
aplikacje WPF mogą nie korzystać z XAML // 1 - przybornik + właściwości // 2 - C# System.Windows.Controls.Button btn = new Button(); btn.Content = "Duś"; // 3 - XAML // lub Duś // XAML udostępnia podzbiór możliwości C# NewButton
rozmieszczanie elementów na formie panele ( tylko jeden w danym oknie, ale można zagnieżdżać ) – Canvas // bez narzuconego układu, elementy // pozycjonowane dowolnie względem panelu // Width,Height : Auto // Alignments : Stretch całe okno..... // definicje elementów CanvasPanel
– DockPanel // rozmieszczenie przy krawędziach Lewy1 Lewy2 Góra1 Góra2 Dół1 Prawy1 DockPanel
– Grid // układ tabelaryczny, domyślny // Margin gdy nie ma wypełnić całego pola GridPanel
– StackPanel// układ stosowy Button 1 Button 2 // Width, Height Auto // Alignments Stretch // adaptacja szerokości elementów // między MinWidth a MaxWidth StackPanel
– WrapPanel// stos z przewijaniem // Width, Height Auto // Alignments Stretch WrapPanel
menu, przyciski narzędzi, status
// private void AlfaME(object sender, MouseEventArgs e) { StatText.Text = "Alfa"; } MenuToolbarStatus
elementy sterujące Button, Ellipse, Expander Slider Lists FlowDocument TabControl ButElipExpa Przesuwka Lista F_Dokument Zakładki
wiązanie elementów sterujących // // Wiąz
style System.Window.Style // klasa stylu // dodać do klasy Application // styl nazwany <Style x:Key ="BigGreenButton " TargetType="Button">
// dodać do klasy Window <Button x:Name="btnTestButton" Content="Jestem Stylowy" Cursor="Help" Style="{StaticResource BigGreenButton}" Width="250" />
// style anonimowe, wyzwalacze..... <Trigger Property = "IsFocused" Value = "True"> <Setter Property = "Background " Value = "Yellow"/> Styles
zasoby logiczne statyczne i dynamiczne // dodać plik zasobów ( BGB.xaml ) // Add/Resource Dictionary.....
// uzupełnić klasę Application // utworzyć element stosując Background= // nie można zmienić zasobu "{StaticResource BackgroundGradientBrush}" // lub Background= // można zmienić zasób "{DynamicResource BackgroundGradientBrush}" StatDynRes
zasoby graficzne włączane do pakietu SolutionExplorer / ProjectName / AddFolder Folder / Add Existing Item // doda ć pliki.jpg // // List images = new List (); images.Add(new BitmapImage( new UriKind.Relative))); int currImage = 0; // imageHolder.Source = images[currImage++]; GraphRes
polecenia standardowe // działają od razu <TextBox Name= " TextData " AcceptsReturn ="True" VerticalScrollBarVisibility="Auto " HorizontalScrollBarVisibility="Auto">
// dodać powiązania i obsługę <CommandBinding Command="ApplicationCommands.Open" Executed="OpenCmdExecuted" CanExecute="OpenCmdCanExecute"/>......
// dodać System.IO, Microsoft.Win32 private void OpenCmdCanExecute( object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = true; } // private void OpenCmdExecuted( object sender, ExecutedRoutedEventArgs e) { OpenFileDialog openDlg = new OpenFileDialog(); if (openDlg.ShowDialog() == true) { string dataFromFile = File.ReadAllText(openDlg.FileName); TextData.Text = dataFromFile; }} PoleStand
generowanie obiektów graficznych – kształty ( Windows.Shapes ) proste figury 2D z interakcją – rysowanie i geometrie ( Windows.Media.Drawing ) bardziej złożona grafika raczej bez interakcji – obiekty wizualne ( Windows.Media.Visual ) przetwarzanie dużych ilości danych graficznych ( tylko C# )
Pędzle i pióra DrawingBrush, ImageBrush, LinearGradientBrush, RadialGradientBrush, SolidColorBrush, Pen // //
Shapes : Ellipse, Rectangle, Line, Polygon, Polyline, Path // Shape shapeToRender = new Line() { Stroke = Brushes.Blue, StrokeThickness = 10, X1 = 0, X2 = 50, Y1 = 0, Y2 = 50, StrokeStartLineCap = PenLineCap.Triangle, StrokeEndLineCap = PenLineCap.Round } Figury
Path set of Geometry Objects : LineGeometry, RectangleGeometry, EllipseGeometry,... <EllipseGeometry Center = "75,70" RadiusX = "30" RadiusY = "30" />
<BezierSegment Point1="100,0" Point3="300,100"/>..... // <Path Grid.Row="1" Stroke="Black" StrokeThickness="3" Data="M 10,75 C 70,15 250, ,175 H 240" /> // M – start, C – Bezier, H – linia pozioma,... Ścieżka
Transformacje MatrixTransform, RotateTransform, ScaleTransform, SkewTransform, TranslateTransform ( move ) Trans
Grupowanie i łączenie geometrii // // NonZero // // Intersect, Xor, Exclude DrawGeom
Rysowanie geometria + pędzel + pióro... // custom pen // custom brush... Draw
Obiekty wizualne i efekty DrawingVisual visual = new DrawingVisual(); DrawingContext dc = visual.RenderOpen(); // dc.DrawLine(), dc.DrawRectangle(), // dc.DrawRoundedRectangle(), dc.DrawText(), // dc.DrawEllipse() dc.Close(); // public class DrawingCanvas : Panel { private List visuals = new List (); public void AddVisual(Visual visual) { visuals.Add(visual); base.AddVisualChild(visual); base.AddLogicalChild(visual); } }
Blur DropShadow Basic dropshadow
DropShadow public class CustomEffect : ShaderEffect { public CustomEffect() { Uri pixelShaderUri = new Uri("Effect.ps", UriKind.Relative); PixelShader = new PixelShader(); PixelShader.UriSource = pixelShaderUri; } } VisusEfe
animacja using System.Windows.Media.Animation; DataTypeAnimation ByteAnimation, ColorAnimation, DoubleAnimation, In32Animation,... DataTypeAnimationUsingKeyFrames StringAnimationUsingKeyFrames, DoubleAnimationUsingKeyFrames, PointAnimationUsingKeyFrames,... DataTypeAnimationUsingPath DoubleAnimationUsingPath, PointAnimationUsingPath,... Ani_1 Ani_2