Präsentation - Software and Systems Engineering

Transcription

Präsentation - Software and Systems Engineering
Technische Universität München
GUI-Programmierung 2 - WPF
Proseminar Objektorientiertes Programmieren mit .NET und C#
Alexander Aumann
Institut für Informatik
Software & Systems Engineering
Technische Universität München
Übersicht
§ 
§ 
§ 
§ 
§ 
Einleitung und Unterschiede zu WindowsForms
XAML – Oberflächendefinitionssprache für WPF
Layouts und Steuerelemente
Styles und Control Templates
DataBinding und Data Templates
14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
2
Technische Universität München
Übersicht
§  Einleitung und Unterschiede zu WindowsForms
§ 
§ 
§ 
§ 
XAML – Oberflächendefinitionssprache für WPF
Layouts und Steuerelemente
Styles und Control Templates
DataBinding und Data Templates
14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
3
Technische Universität München
WPF – Windows Presentation Foundation
§  Programmierschnittstelle zur Oberflächenerstellung für
Windows in .NET
§  Nachfolger von WindowsForms
§  Komplett neuartige Umsetzung
14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
4
Technische Universität München
Vergleich WPF - WindowsForms
§  WindowsForms greift zum Zeichnen von Standard-Kontrollelementen auf
die Win32-API (speziell GDI/GDI+) zurück
§  WPF verwendet DirectX um alle Steuerelemente selbst zu zeichnen
–  Hardwarebeschleunigt - Ausnutzung moderner Grafikkarten
–  Einfaches und Umfassendes Anpassen des Aussehens von
Steuerelementen möglich
–  XAML zum Definieren umfangreicher Oberflächen komplett ohne C#
Code
•  → Strikte Trennung von Design und Programmlogik
§  Nachteile: steile Lernkurve, Einarbeitungszeit, WindowsForms ausgereifter
14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
5
Technische Universität München
Übersicht
§  Einleitung und Unterschiede zu WindowsForms
§  XAML – Oberflächendefinitionssprache für WPF
§  Layouts und Steuerelemente
§  Styles und Control Templates
§  DataBinding und Data Templates
14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
6
Technische Universität München
XAML – Extensible Application Markup Language
§  Basierend auf XML
§  Sprache zur Definition des Layouts der Oberfläche und des Aussehens der
einzelnen Steuerelemente (→ Control Templates, Styles)
§  Auch Ressourcenverwaltung in XAML
§  Neues WPF-Projekt enthält
–  App.xaml
–  App.xaml.cs
–  MainWindow.xaml
–  MainWindow.cs
14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
7
Technische Universität München
XAML – Erstes Beispiel
§  MainWindow.xaml
<Window x:Class="WpfApplication.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> </Grid> </Window> §  MainWindow.xaml.cs
using System; (...weitere using-­‐Direktiven...) namespace WpfApplication { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } } } 14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
8
Technische Universität München
Übersicht
§  Einleitung und Unterschiede zu WindowsForms
§  XAML – Oberflächendefinitionssprache für WPF
§  Layouts und Steuerelemente
§  Styles und Control Templates
§  DataBinding und Data Templates
14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
9
Technische Universität München
Layouts und Steuerelemente
§  Verfügbare Layout-Container
–  StackPanel
–  WrapPanel
–  DockPanel
–  Grid
–  UniformGrid
–  Canvas
§  Können beliebig geschachtelt werden
§  Standardsteuerelemente ähnlich wie in WindowsForms
–  Allerdings fehlen einige wenige Steuerelemente wie
•  DateTimePicker
•  DataGridView
•  FolderBrowserDialog
14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
10
Technische Universität München
StackPanel
§  Ordnet Elemente als vertikalen
oder horizontalen Stapel an
§  Einzelne Elemente können
durch Alignment-Eigenschaften
ihre Anordnung im Stapel
beeinflussen
<StackPanel HorizontalAlignment="Stretch" Margin="3" Name="stackPanel1"> <Label Content="Label oben" Name="label1" /> <Button Content="Button ohne Alignment" Name="button1" /> <Button Content="Button Alignment right" Name="button2" HorizontalAlignment="Right"/> <TextBox Text="Textfeld Alignment Center" Name="textBox1" HorizontalAlignment="Center"/> <Button Content="Button Alignmentleft" Name="button3" HorizontalAlignment="Left"/> </StackPanel> 14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
11
Technische Universität München
DockPanel
§  Kann Elemente an vier Seiten
andocken (z.B. Toolbars)
§  Restlicher Platz geht an übrige
Elemente
§  Reihenfolge der Anordnung
entscheidend
<DockPanel Name="dockPanel1"> <Button Content="oben" Name="button1" DockPanel.Dock="Top"/> <Button Content="links" Name="button2" DockPanel.Dock="Left"/> <Button Content="rechts" Name="button3" DockPanel.Dock="Right"/> <Button Content="unten" Name="button4" DockPanel.Dock="Bottom"/> <Button Content="rest" Name="button5" /> </DockPanel> 14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
12
Technische Universität München
WrapPanel
§  Ordnet Elemente als Reihe an
§  Bei Platzmangel werden die
Elemente in die nächste Reihe
geschoben
<WrapPanel Name="wrapPanel1"> <Button Content="Hoch" Height="50" Name="button1" /> <Button Content="Zentral" VerticalAlignment="Center" Name="button2" /> <Button Content="Oben" VerticalAlignment="Top" Name="button3" /> <Button Content="Gestreckt" Name="button4" /> <Button Content="Unten" VerticalAlignment="Bottom" Name="button5" /> </WrapPanel> 14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
13
Technische Universität München
Grid
§  Mächtigster Layoutcontainer
§  Teilt Gebiet in Zeilen und Spalten auf
§  Komponenten werden einer Zelle zugewiesen, können sich aber über
mehrere Zeilen und/oder Spalten erstrecken
§  Aufwändige Layouts möglich
14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
14
Technische Universität München
Grid – Beispielanwendung Filmsammlung
14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
15
Technische Universität München
Grid – Beispielanwendung Filmsammlung
<Grid Name="gridMain" Margin="3"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="1*"/> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="3*"/> </Grid.ColumnDefinitions> <Label Content="Filmsammlung" Name="labelListTitle" HorizontalAlignment="Center" VerticalAlignment="Top"/> <ListBox Name="listBoxFilms" Grid.Row="1" Grid.RowSpan="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" MinWidth="30" HorizontalContentAlignment="Stretch" Margin="2"/> <GridSplitter Name="gridSplitter1" Grid.Column="1" Grid.Row="0" Grid.RowSpan="3" HorizontalAlignment="Center" VerticalAlignment="Stretch" Width="5" /> <Label Content="Filmdaten" Name="labelFilmData" Grid.Column="2" Grid.ColumnSpan="4" HorizontalAlignment="Center" VerticalAlignment="Top"/> <Grid Name="gridRight" Grid.Row="1" Grid.Column="2" Margin="2"> ...[Labels und TextBox-­‐Steuerelemente rechtes Grid]... </Grid> <StackPanel Name="stackPanelButtons" Grid.Column ="2" Grid.ColumnSpan="1" Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Right" Margin="2"> <Button … /> <Button ...> </StackPanel> </Grid> 14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
16
Technische Universität München
Andere Layouts
§  Uniform Grid
–  Teilt Gebiet in gleich große Zeilen und Spalten auf
§  Canvas
–  Erlaubt starre Anordnung nach Koordinatens
14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
17
Technische Universität München
Übersicht
§  Einleitung und Unterschiede zu WindowsForms
§  XAML – Oberflächendefinitionssprache für WPF
§  Layouts und Steuerelemente
§  Styles und Control Templates
§  DataBinding und Data Templates
14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
18
Technische Universität München
Styles und Control Templates
§  Ermöglichen es dem Designer einer Anwendung bzw. einzelnen
Kontrollelementen ein völlig neues Aussehen zu geben
–  in XAML
–  ohne das Element komplett neu zu schreiben
•  → die Bedienfunktionalität bleibt erhalten (Button sendet seine Events etc.)
§  Durch sogenannte Trigger auch abhängig von Eigenschaften, die sich
dynamisch ändern (z.B. Fokus) und damit auch MouseOver-Effekte
möglich
14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
19
Technische Universität München
Styles – ein Beispiel
§  Style um einzelne Eigenschaften von Steuerelementen zu
verändern
§  Beispiel: Label mit geänderter Schriftart, -größe und -farbe
<Style x:Key="LabelHeaderStyle"> <Style.Setters> <Setter Property="Label.FontSize" Value="14"/> <Setter Property="Label.FontWeight" Value="Bold"/> <Setter Property="Label.FontFamily" Value="TimesNewRoman"/> <Setter Property="Label.Foreground"> <Setter.Value> <LinearGradientBrush > <GradientStop Color="Black" Offset="0"/> <GradientStop Color="Black" Offset="0.66"/> <GradientStop Color="Black" Offset="1"/> </LinearGradientBrush> </Setter.Value> </Setter> </Style.Setters> </Style> 14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
20
Technische Universität München
Styles – Event Trigger
§  Ermöglichen es auf Events zu reagieren und
Steuerelementeigenschaften entsprechend zu setzen
§  Beispiel: Schriftfarbe animieren, wenn Mauszeiger über Label
<Style> ...Setter... <Style.Triggers> <EventTrigger RoutedEvent="Mouse.MouseEnter"> <EventTrigger.Actions> <BeginStoryboard> <Storyboard> <ColorAnimation Storyboard.TargetProperty="Foreground.GradientStops[1].Color" To="BurlyWood" Duration="0:0:0.5" AutoReverse="False"/> </Storyboard> </BeginStoryboard> </EventTrigger.Actions> </EventTrigger> <EventTrigger RoutedEvent="Mouse.MouseLeave">...rückgängig machen... </EventTrigger> </Style.Triggers> </Style> 14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
21
Technische Universität München
Style mit Steuerelementen verknüpfen
§  Styles werden im Regelfall zur Fenster- oder Anwendungsklasse als
Ressource hinzugefügt (entweder direkt oder durch Einbinden einer Datei)
§  Zwei Möglichkeiten der Verknüpfung:
–  Setzen der Style-Eigenschaft und verbinden mit Ressource
<Label Content="Filmdaten" (...) Style="{StaticResource LabelHeaderStyle}"/> –  Automatisch für alle Steuerelemente eines Typs:
•  Keinen Key für den Style vergeben und TargetType festlegen
<Style TargetType="Button"> (...) </Style > 14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
22
Technische Universität München
Styles und Control Templates
§  Control Templates
–  Elemente sind (intern) aus weiteren Elementen zusammengesetzt
–  Diese Elemente / die Art des
Zusammenbaus lassen sich mit
Control Templates modifizieren
–  Bieten somit eine mächtige
Ergänzung zu Styles
14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
23
Technische Universität München
Beispiel: ein eigenes Button Control Template
<Style TargetType="Button"> <Setter> .... </Setter> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Border TextBlock.Foreground="{TemplateBinding Foreground}" x:Name="Border" CornerRadius="8" BorderThickness="1"> <Border.BorderBrush> ...BorderBrush festlegen... </Border.BorderBrush> <Border.Background> ...Hintergrund festlegen... </Border.Background> <VisualStateManager.VisualStateGroups> ...siehe rechts...-­‐> </VisualStateManager.VisualStateGroups> <ContentPresenter Margin="{TemplateBinding Padding}" HorizontalAlignment="Center" VerticalAlignment="Center" RecognizesAccessKey="True" /> </Border> <ControlTemplate.Triggers> ...auch Trigger können zusätzlich definiert werden... </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> 14.12.10
<VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="CommonStates"> <VisualStateGroup.Transitions> <VisualTransition GeneratedDuration="0:0:0.5" /> <VisualTransition GeneratedDuration="0" To="Pressed" /> </VisualStateGroup.Transitions> <VisualState x:Name="Normal" /> <VisualState x:Name="MouseOver"> ...festlegen, wie der Button aussieht, wenn der Mauszeiger darüberliegt... </VisualState> <VisualState x:Name="Pressed"> ...festlegen, wie ein gedrückter Button aussieht... </VisualState> <VisualState x:Name="Disabled"> ...festlegen, wie deaktivierter Button aussieht... </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> Alexander Aumann: GUI-Entwicklung 2: WPF
24
Technische Universität München
Ergebnis: Filmsammlung vorher
14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
25
Technische Universität München
Ergebnis: Filmsammlung nachher
14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
26
Technische Universität München
Übersicht
§ 
§ 
§ 
§ 
Einleitung und Unterschiede zu WindowsForms
XAML – Oberflächendefinitionssprache für WPF
Layouts und Steuerelemente
Styles und Control Templates
§  DataBinding und Data Templates
14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
27
Technische Universität München
Data Binding und DataTemplates
§  zuständig für Bindung zwischen Daten und Darstellung
§  (Dependency) Property Binding
–  Eigenschaften eines Elements als Quelle und eines anderen als Ziel
•  Bindung der Schriftgröße eines Elements an die Position einer Scrollleiste
–  Schriftgröße passt sich direkt an, wenn Scrollleiste bewegt wird
•  Bindung einer Farbauswahlliste an die Farbe bestimmter Elemente
§  Bindung an komplexe Datenstrukturen
–  Anbindung einer internen Liste von Filmen an eine ListBox und Füllen
der Textfelder, je nachdem welcher Film gewählt ist (siehe folgende
Folien)
14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
28
Technische Universität München
Data Binding 1: Daten bereitstellen
§  Klasse Film mit entsprechenden
public properties:
§  Code zum Vernüpfen der ListBox
mit der datenseitigen Filmliste
14.12.10
class Film { private string fullName; public string FullName { get { return fullName; } set { fullName=value;} } private string shortName; public string ShortName { get { return shortName; } set { shortName=value; } } ...restliche Properties... } public partial class MainWindow : Window { DataStore ds; ObservableCollection<Film> films; public MainWindow() { InitializeComponent(); ds = new DataStore(); films = ds.GetFilms(); listBoxFilms.ItemsSource = films; } } Alexander Aumann: GUI-Entwicklung 2: WPF
29
Technische Universität München
Data Binding 2: Daten mit Anzeige verknüfpen
§  Text-Property der Textfelder mit
entsprechender Film-Property
verknüpfen: Data Binding
hinzufügen
<TextBox Name="textBoxTitleComplete" (...) Text="{Binding Path=FullName}" /> §  Datenquelle setzen
–  DataContext im Grid setzen
=> Kinder „erben“ diesen
Context als Quelle für ihr
Data Binding
<Grid Name="gridMain" Margin="3" DataContext= "{Binding ElementName=listBoxFilms, Path=SelectedItem}" > (...) </Grid > 14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
30
Technische Universität München
Data Binding: Filmsammlung / Stand der Dinge
14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
31
Technische Universität München
DataTemplates – Darstellung eines Filmobjekts
§  Data Templates
–  Wie werden die einzelnen Daten im Kontrollelement dargestellt
–  Beliebiges Layout und Steuerelemente möglich
–  Beispiele
•  Anordnung von Daten in einer Tabellenzelle
•  in einem einzelnen Listenelement nicht nur der Filmtitel, sondern noch ein oder
mehrere Zusatzinformationen
→ Dadurch wird die an sich einfache Standardliste nahezu beliebig
erweiterbar
14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
32
Technische Universität München
Data Template: Listenelement
§  Data Template definieren
<DataTemplate x:Key="FilmDataTemplate"> <Border CornerRadius="4" BorderThickness="1" Margin="3"> <Border.BorderBrush> <SolidColorBrush Color="{StaticResource BorderMediumColor}" /> </Border.BorderBrush> <Grid Margin="2"> (...Grid.Row und Grid.Column Definitionen...) <TextBlock Grid.Row="0" FontWeight="Bold" Text="{Binding Path=ShortName}"/> <TextBlock Grid.Row="1" Text="{Binding Path=Directors}" Margin="4, 0, 0, 0" HorizontalAlignment="Left"/> </Grid> </Border> </DataTemplate> §  Template für die ListBox setzen
<ListBox Name="listBoxFilms" ItemTemplate="{StaticResource FilmDataTemplate}" HorizontalContentAlignment="Stretch" (...) /> 14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
33
Technische Universität München
Endergebnis
§  Filmsammlung mit vorgestellten Styles und Data Bindings
14.12.10
Alexander Aumann: GUI-Entwicklung 2: WPF
34

Documents pareils