Windows Presentation Foundation
Tworzenie interfejsu użytkownika Współpraca projektanta i programisty (XAML) Interfejsy atrakcyjniejsze graficznie (np. 3D) Aplikacje internetowe (XBAP) Użycie Layoutów Style i szablony Interfejsy wielookienkowe i nawigacyjne
Rysowanie 2D i 3D Grafika i kontrolki jako elementy visual tree Transformacje i animacje Skalowalność (użycie grafiki wektorowej) Wykorzystanie możliwości karty graficznej Zamiana GDI+ na DirectX
Media Obrazy JPEG, BMP, GIF, TIFF, PNG i inne Audio i Video Kontrolka MediaElement WMV, MPEG, AVI Wykorzystanie Windows Media Player'a
Źródła danych Łączenie kontrolek ze źródłami danych np. TextBox'a z właściwością obiektu np. ListBox'a z dowolną kolekcją Klasa Binding
Binding <TreeView Name = "treeview"> <TreeViewItem... />... </TreeView> <TextBlock x:name = "currentfolder" Text = "{ Binding ElementName = treeview, Path = SelectedItem.Header}"/>
Dokumenty i czcionki Dokumenty niezmienne ten sam wygląd na ekranie i po wydruku XPS Dokumenty pływające lepsza czytelność dostosowywanie wyglądu np. do rozmiaru okna wygodniejsze przeglądanie Zaawansowany mechanizm obsługi czcionek OpenType, ClearType Teksty w formacie Unicode
Przykład
XAML (Extensible Application Markup Language) Język deklaratywny Oparty na XML'u Ułatwia współpracę projektanta z programistą Może być używany w połączeniu z C# (code behind)
XAML <WrapPanel Background="Pink"> <Button Content="Ala" /> <Button> <Button.Content> "Ela" </Button.Content> </Button> <Button> "Ola" </Button> </WrapPanel>
X A M L Uniwersalny język do tworzenia i inicjalizowania obiektów Stosowany nie tylko w WPF: Windows Workflow Foundation Windows Communication Foundation
Elementy i atrybuty <Button Content = "OK" Click = "button_click"/> X M L.NET deklaracja elementu == utworzenie obiektu ustawienie atrybutu == ustawienie właściwości lub ustawienie atrybutu == obsłużenie zdarzenia
Elementy właściwości(owe) <Button> <Button.Content> <Rectangle Height = "40" Width = "40"> </Button.Content> <Button.Background> <SolidColorBrush Color = "White"/> </Button.Background> </Button>
Elementy kolekcji <ListBox> <ListBox.Items> <ListBoxItem Content= Item 1 /> <ListBoxItem Content= Item 2 /> </ListBox.Items> </ListBox>
"content property" <Button> Ala </Button> <ListBox> <ListBoxItem Content= Item 1 /> <ListBoxItem Content= Item 2 /> </ListBox>
Rozmiary i położenie kontrolek Height, MinHeight, MaxHeight, ActualHeight Width, MinWidth, MaxWidth, ActualWidth Margin ( np. "0, 10, 20, 30"; "10, 20" "15" ) Padding HorizontalAlignment (Left, Center, Right, Stretch) VerticalAlignment (Top, Center, Bottom, Stretch)
Panele Canvas StackPanel WrapPanel DockPanel Grid
Canvas Domyślnie: kontrolki w lewym górnym rogu kontrolki nachodzą na siebie Właściwości Left Top Right Bottom ZIndex
Attached properties <Canvas> <Button Canvas.Left = "50" Canvas.Top = "30" Content = "OK" /> <Button Canvas.Bottom = "100" Canvas.Right = "30" Content = "Anuluj" /> </Canvas>
Attached properties <StackPanel TextElement.FontSize = "30"> <Button Content = "OK" /> <Button Content = "Anuluj" /> </StackPanel>
StackPanel Rozmieszczenie kontrolek: jedna obok drugiej jedna nad drugą Właściwość Orientation Vertical (domyślnie) Horizontal
WrapPanel Rozmieszczenie kontrolek: jedna obok drugiej jedna nad drugą jeśli się nie mieszczą w rzędzie lub kolumnie nowy rząd nowa kolumna Właściwości Orientation, ItemHeight, ItemWidth
DockPanel Rozmieszczenie kontrolek: wzdłuż czterech brzegów ostatnia wypełnia Właściwości Dock Left, Top, Right, Bottom LastChildFill true, false
Grid Rozmieszczenie kontrolek w formie tabeli określona ilość wierszy i kolumn Właściwości RowDefinitions RowDefinition.Height,...SharedSizeGroup ColumnDefinitions ColumnDefinition.Width,...SharedSizeGroup Row, RowSpan Column, ColumnSpan
GridSplitter Umożliwia użytkownikowi zmianę szerokości kolumn wysokości wierszy Właściwości HorizontalAlignment VerticalAlignment ResizeDirection Auto, Rows, Columns ResizeBehavior BasedOnAlignment, PreviousAndCurrent, CurrentAndNext, PreviousAndNext
Gdy coś się nie mieści Clipping właściwość ClipToBounds Scrolling ScrollViewer Scaling Viewbox Stretch ( None, Fill, Uniform, UniformToFill ) StretchDirection ( UpOnly, DownOnly, Both )
Transformacje LayoutTransform przed umieszczeniem elementu w kontenerze RenderTransform po umieszczeniu elementu w kontenerze RenderTransformOrigin środek transformacji
Transformacje RotateTransform ScaleTransform SkewTransform TranslateTransform MatrixTransform
Transformacje <Button Background= Yellow > <Button.RenderTransform> <ScaleTransform ScaleX= 2 ScaleY= 2 /> </Button.RenderTransform> Przeskalowany </Button>
Łączenie transformacji <Button> <Button.RenderTransform> <TransformGroup> <RotateTransform Angle= 45 /> <ScaleTransform ScaleX= 5 ScaleY= 1 /> <SkewTransform AngleX= 30 /> </TransformGroup> </Button.RenderTransform> OK </Button>
Kontrolki Content Controls Items Controls Others
Przyciski Typ bazowy BaseButton Button RepeatButton ToggleButton CheckBox RadioButton
Typ bazowy BaseButton Content HasContent Click IsPressed ClickMode Release Press Hover
Button IsDefault IsDefaulted IsCancel
RepeatButton Delay Interval
ToggleButton IsChecked ( true, false, null ) IsThreeState Zdarzenia Checked Unchecked Indeterminate
CheckBox... To tylko ToggleButton z innym wyglądem
RadioButton Dziedziczy po ToggleButton Może być zaznaczony jeden w grupie Użytkownik może tylko zaznaczać Grupowanie RadioButton'ów wspólny, bezpośredni rodzic właściwość GroupName
Routed event Zachodzi dla danego elementu visual tree, a następnie dla kolejnych elementów, aż do korzenia (Bubbling) Zachodzi dla korzenia visual tree, a następnie dla kolejnych elementów, aż do elementu, który był źródłem zdarzenia (Tunneling) Zachodzi tylko dla elementu źródłowego (Direct)
RoutedEventArgs Dziedziczy po System.EventArgs Zawiera: Source (logical tree) OriginalSource (visual tree) Handled RoutedEvent (jakie zdarzenie)
Bubbeling a Tunneling Większość zdarzeń jest typu Bubbeling Zdarzenia często występują parami Zdarzenie (np. KeyDown) PreviewZdarzenie (np. PreviewKeyDown) PreviewZdarzenie obsłużenie == anulowanie Zdarzenia (Handled=true) jest typu Tunneling elementy UI nie reagują na te zdarzenia
Zdarzenia klawiatury (Preview)KeyDown (Preview)KeyUp IsKeyboardFocusedChanged IsKeyboardFocusWithinChanged (Preview)GotKeyboardFocus (Preview)LostKeyboardFocus
Attached events (zdarzenia przyczepione) Zdarzenia "tunelują" i "bąbelkują także przez elementy, które takich zdarzeń nie zawierają Element może obsłużyć zdarzenie z innej klasy <Window Title = "Okno" Button.Click = "Metoda"> <Button Content = "Ala" /> <Button Content = "Ola" /> </Window>
Zdarzenia myszy MouseEnter, MouseLeave (Preview)MouseMove (Preview)MouseDown /...Up (Preview)MouseLeftButtonDown /...Up (Preview)MouseRightButtonDown /...Up (Preview)MouseWheel...
ListBox <ListBox> <Label> Ola </Label> <Button> Ala </Button> <Image Source = "obrazek.jpg" /> <sys:datetime> 1/1/2012 </sys:datetime> </ListBox>
Właściwość Items... typu ItemCollection content property Właściwość tylko do odczytu Każdy element może być dowolnym obiektem... i jest wyświetlany tak jak w ContentControl Elementy typu UIElement wyglądają jak zwykle Elementy innych typów == TextBlock (ToString( ))
Dependency properties Powiadamianie o zmianie wartości Dziedziczenie wartości Wielu "dostawców" wartości
Powiadamianie <Trigger Property = "IsMouseOver" Value = "True"> <Setter Property = "Foreground" Value = "Blue"/> </Trigger> Tylko w stylach i szablonach!
Wielu dostawców 1. Local value 2. Parent template trigger 3. Parent template 4. Style triggers 5. Template triggers 6. Style setters 7. Theme style triggers 8. Theme style setters 9. Property value inheritance 10. Default value