windows presentation foundation (wpf)
DESCRIPTION
Windows Presentation Foundation (WPF). Vizuális Programozás. WPF. Új grafikus alrendszer 2D és 3D grafika Dokumentumok Média Teljesen vektorgrafika orientált könnyen nagyítható (pl. felhasználói felület) DirectX szükséges Lebegőpontos koordináták, logikai pixel. - PowerPoint PPT PresentationTRANSCRIPT
Windows Presentation Foundation (WPF)
J.Zs.Cs.: Vizuális programozás (c) 2017
WPF 2D és 3D grafika Dokumentumok Média Teljesen vektorgrafika orientált
könnyen nagyítható (pl. felhasználói felület)
DirectX szükséges Lebegőpontos koordináták, logikai
pixel
2
Felület létrehozása, komponensek használata
J.Zs.Cs.: Vizuális programozás (c) 2017
3
Felület létrehozása
C# kódból
XAML – Visual Studio, Expression Blend, Jegyzettömb
J.Zs.Cs.: Vizuális programozás (c) 2017
5
J.Zs.Cs.: Vizuális programozás (c) 2017
Felület C# kódból6
J.Zs.Cs.: Vizuális programozás (c) 2017
Felület XAML kódból
eXtensible Application Markup Language Cél: design és kód különválasztása Profi alkalmazásoknál külön tervező Deklaratív alkalmazásfejlesztési modell
7
XAML Gyökérelemek
Window Page Application
Elem Egy osztály
Attribútum Egy tulajdonság a komponens
osztályában
J.Zs.Cs.: Vizuális programozás (c) 2017
8
BAML
Binary Application Markup Language Az XAML-ben leírt felület bináris
változata Fordításkor keletkezik az XAML-ből EXE-be beágyazva ~\obj\Debug\*.BAML Betöltés az InitializeComponent-
benJ.Zs.Cs.: Vizuális programozás (c) 2017
9
C# - ban
Hivatkozás a nyomógombra a kódban XAML-ben Name="btPróba"
attribútum Az eseménykezelőben
btPróba.Background = Brushes.Red; btPróba.Content = "Felirat";
J.Zs.Cs.: Vizuális programozás (c) 2017
10
Document Outline Tervezési nézetben a
felületet leíró dokumentumhierarchiát megtekinthetjük a Document Outline ablakban
Fa hierarchiák WPF-ben Logikai fa Vizuális fa
J.Zs.Cs.: Vizuális programozás (c) 2017
11
Logikai fa Leírja a szülő és a gyerek
objektumok közötti összefüggést Rácsban nyomógomb, amiben
rács, amiben kép és szöveg Fontos a tulajdonságok öröklése
szempontjából Navigálás: GetParent,
GetChildren, FindLogicalNode
J.Zs.Cs.: Vizuális programozás (c) 2017
12
Vizuális fa
Meghatározza, hogy egy objektum hogyan lesz megjelenítve a grafikus alapelemek felhasználásával (vonalak, négyszögek, stb.)
Fontos a transzformációk szempontjából
J.Zs.Cs.: Vizuális programozás (c) 2017
13
Application osztály
System.Windows.ApplicationTulajdonságok: Current – a futó alkalmazás objektum –
pl. alkalmazás szintű változók, leállítás MainWindow – a fő ablak Windows – az alkalmazást létrehozó
szálból létrehozott ablakok gyűjteménye
J.Zs.Cs.: Vizuális programozás (c) 2017
14
Application osztály
StartupUri – az alkalmazás indításakor automatikusan megnyitott ablak/lap
Properties – az alkalmazásból bárhonnan elérhető adatok tárolása
Application.Current.Properties["Név"]=Érték;Események: Startup Exit
J.Zs.Cs.: Vizuális programozás (c) 2017
15
Vezérlők Nem kell új (származtatott) vezérlőt
írni ahhoz, hogy egy vezérlő megjelenését megváltoztassuk (pl. ellipszis alakú nyomógomb)
Sablonokkal (Template) megoldva Csak akkor kell új vezérlőt írni, ha a
viselkedést akarjuk megváltoztatni
J.Zs.Cs.: Vizuális programozás (c) 2017
16
Core user input controls Button, RadioButton, ComboBox, CheckBox, Calendar, DatePicker, Expander, DataGrid, ListBox, ListView, Slider, ToggleButton, TreeView, ContextMenu, ScrollBar, Slider, TabControl, TextBlock, TextBox, RepeatButton, RichTextBox, Label
J.Zs.Cs.: Vizuális programozás (c) 2017
17
Window and controldecoration
Menu, ToolBar, StatusBar, ToolTip, ProgressBar
J.Zs.Cs.: Vizuális programozás (c) 2017
18
Media controls
Image, MediaElement, SoundPlayerAction
J.Zs.Cs.: Vizuális programozás (c) 2017
19
Tárolók (rétegmenedzserek) Grid – sorok és oszlopok alakíthatók ki UniformGrid – minden cella azonos
méretű StackPanel – vízszintesen vagy
függőlegesen elhelyezett elemek DockPanel – dokkolás támogatása Canvas – koordináta alapú tárolás WrapPanel – az elemek egyenes
vonalban helyezkednek el A tárolók egymásba ágyazhatóak
J.Zs.Cs.: Vizuális programozás (c) 2017
20
Grid és DockPanel
J.Zs.Cs.: Vizuális programozás (c) 2017
21
StackPanel Térköz nélkül helyezi el az
elemeket alapból
J.Zs.Cs.: Vizuális programozás (c) 2017
22
Canvas
J.Zs.Cs.: Vizuális programozás (c) 2017
23
Jobbra igazított menüpont a főmenüben
J.Zs.Cs.: Vizuális programozás (c) 2017
25
Menüpontok függőlegesen középre igazítása
<Menu x:Name="mnFőmenü" Height="30"> <Menu.ItemsPanel> <ItemsPanelTemplate> <DockPanel
HorizontalAlignment="Stretch"/> </ItemsPanelTemplate> </Menu.ItemsPanel> <MenuItem Header="Kever" x:Name="miKever" VerticalAlignment="Center" />
J.Zs.Cs.: Vizuális programozás (c) 2017
26
GridSplitter
<Grid x:Name="grRács"><Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/> <ColumnDefinition />
</Grid.ColumnDefinitions> <TextBox Grid.Column="0" MinWidth="100"
Text="TextBox"/><GridSplitter Grid.Column="0" Width="5" /><TextBox Grid.Column="1" TextWrapping="Wrap" Text="TextBox" />
</Grid>
J.Zs.Cs.: Vizuális programozás (c) 2017
27
Eszköztár<ToolBar Height="34" DockPanel.Dock="Top" >
<Button Content="Indít" /><Button ><Image Source="/Ikonok/copy.ico"/></Button><Button><Image Source="/Ikonok/cut.ico"/></Button><Button><Image Source="/Ikonok/delete.ico"/></Button><Button><Image Source="/Ikonok/paste.ico"/></Button>
</ToolBar>
J.Zs.Cs.: Vizuális programozás (c) 2017
Visual Studio Image Library: https://www.microsoft.com/en-us/download/details.aspx?id=35825
28
Ikonok befordítása a szerelvénybe1
Solution Explorerben egy mappa az ikonoknak
Ikonok bemásolása a mappába
Ikonok kijelöléseJ.Zs.Cs.: Vizuális programozás (c) 2017
29
Ikonok befordítása a szerelvénybe2
Properties Build Action=Resource Copy to Output Directory=Do not
copy
Build/Rebuild Solution
J.Zs.Cs.: Vizuális programozás (c) 2017
30
Képek tárolása szerelvényen kívül
Properties Build Action=Content Copy to Output Directory=Copy
always Build/Rebuild Solution
J.Zs.Cs.: Vizuális programozás (c) 2017
31
Többsoros szövegmező
J.Zs.Cs.: Vizuális programozás (c) 2017
32
Események és viselkedés
J.Zs.Cs.: Vizuális programozás (c) 2017
33
Viselkedés
A viselkedést a vezérlő API-ja határozza meg
Parancsok (Commands) – műveletek támogatása: Copy, Cut, Paste, stb.
Viselkedés vagy a kinézet módosítása tulajdonságokkal: font, háttérszín, stb.
Események Funkcionalitást megvalósító metódusok:
Sort, ClearJ.Zs.Cs.: Vizuális programozás (c) 2017
34
Eseménykezelés
Eseményekre fel lehet iratkozni: Design nézetből a Properties ablakban
Alapértelemezett eseményre feliratkozás duplán rákattintva a vezérlőre (pl.: Button-nél a click)
XAML-ből Pl: <Button x:Name="btBack" Content="Vissza" Click="btBack_Click"/>
C# kódbólJ.Zs.Cs.: Vizuális programozás (c) 2017
35
Eseménytípusok Továbbított esemény (Routed Events)
Ha egy vezérlő több elemből épül fel (pl. egy nyomógomb, amin van egy kép és egy szöveg)
Attól függetlenül, hogy a képen, a szövegen vagy a nyomógombon kattintunk ugyanolyan értesítés akarunk kapni
Direkt esemény (Direct Event) – a WinForm-mal azonos módon működik, az eseményt csak az előidéző objektumban dolgozhatjuk fel
J.Zs.Cs.: Vizuális programozás (c) 2017
36
Továbbított esemény
Buborék esemény (Bubbling Event) – először az eseményt kiváltó vezérlő kapja meg, majd az őt tartalmazó rács, majd a nyomógomb, és így tovább felfelé a hierarchiában a gyökér csomópontig.
Lefutó esemény (Tunneling Event) – Preview-al kezdődik a neve, a gyökértől kiindulva halad lefele az esemény előidéző vezérlőhöz. Általában az események blokkolására használják: e.Handled=true;
Először a TE ()majd a BE () következik be
J.Zs.Cs.: Vizuális programozás (c) 2017
37
Commands Egy műveletet több módon is
előidézhetünk: menü, gyorsbillentyű, eszköztár
Kössük őket össze, hogy egyszerűen megoldható legyen a letiltás/engedélyezés → Commands objektumok
Beépített és programozó által definiált parancs osztályok
J.Zs.Cs.: Vizuális programozás (c) 2017
38
Beépített parancs osztályok
ApplicationCommands: pl. vágólap, mentés, megnyitás, új, lezárás, nyomtatás
ComponentCommands: vezérlőktől származó parancsok és információk feldolgozása: pl. ScrollUp
EditingCommands: szövegszerkesztési parancsok: pl. félkövér, dőlt, igazítás
MediaCommands: video és audio lejátszását előíró parancsok: pl. lejátszás, szünet, hangerő, sávválasztás
J.Zs.Cs.: Vizuális programozás (c) 2017
39
CommandBinding A CommandBinding osztály kapcsolja
össze a parancsot és az eseménykezelőt
Eseményei: CanExecute: e.CanExecute=true; Executed
Példa: 05_Szovegszerk
J.Zs.Cs.: Vizuális programozás (c) 2017
40
Vezérlők csatolása
J.Zs.Cs.: Vizuális programozás (c) 2017
41
J.Zs.Cs.: Vizuális programozás (c) 2017
42
Űrlapok, adatbevitel és ellenőrzés
J.Zs.Cs.: Vizuális programozás (c) 2017
43
Párbeszédablakok típusai Megjelenítés módja szerint
Modális ( ShowDialog() ) Nem modális ( Show() )
A megoldás módja szerint Beépített (üzenetablak, common dialog boxes) Saját készítésű (custom dialog box)
Az űrlap egy külön ablakban (párbeszédablak) jelenik meg Az űrlap az alkalmazás főablakában van elhelyezve, de
alapból rejtett
J.Zs.Cs.: Vizuális programozás (c) 2017
44
Beépített párbeszédablakok
Üzenetablak: MessageBox Common Dialog Boxes – Közös
párbeszédablakok (Microsoft.Win32) SaveFileDialog OpenFileDialog PrintDialog
J.Zs.Cs.: Vizuális programozás (c) 2017
45
Egyszerű üzenetablak
MessageBox.Show("Egyszerű üzenetablak");
J.Zs.Cs.: Vizuális programozás (c) 2017
46
Kétgombos üzenetablak
J.Zs.Cs.: Vizuális programozás (c) 2017
47
Háromgombos üzenetablak
J.Zs.Cs.: Vizuális programozás (c) 2017
48
OpenFileDialog
J.Zs.Cs.: Vizuális programozás (c) 2017
49
SaveFileDialog
J.Zs.Cs.: Vizuális programozás (c) 2017
50
PrintDialog
Dokumentumok nyomtatása
PrintDialog pd = new System.Windows.Controls.PrintDialog();pd.PageRangeSelection = PageRangeSelection.AllPages;pd.UserPageRangeEnabled = true;// Megjelenítjük az ablakotNullable<bool> result = pd.ShowDialog();//mire kattintottak if (result == true){ //nyomtatás} J.Zs.Cs.: Vizuális programozás (c) 2017
51
Általános lépések
Párbeszédablak objektum létrehozása Kezdeti megjelenést szabályozó
tulajdonságok beállítása Megjelenítés Ha OK-val zárta be a felhasználó, akkor
módosított tulajdonságok kiolvasása
J.Zs.Cs.: Vizuális programozás (c) 2017
52
Egyéni párbeszédablak (Custom Dialog Box) készítése
Szokásos ablakfelépítés Ne jelenjen meg a tálcán: ShowInTaskbar="False" Jelenjen meg a szülő ablak területén:
WindowStartupLocation="CenterOwner" Melyik vezérlő rendelkezzen kezdetben input fókusszal
(ablak Window tagben beállítva)?FocusManager.FocusedElement= "{Binding ElementName=tbElső}"
OK gomb IsDefault="True" Mégse gomb IsCancel="True" DialogResult tulajdonság true/false
J.Zs.Cs.: Vizuális programozás (c) 2017
53
Űrlap külön ablakban –Jelszóbeviteli párbeszédablak
J.Zs.Cs.: Vizuális programozás (c) 2017
Csatolás
Csatolás
54
Használat
J.Zs.Cs.: Vizuális programozás (c) 2017
55Párbeszédablak
osztálya
Főablak osztálya
Legyen más osztályból is olvasható
Legyen más osztályból is olvasható
Párbeszédablak kezdeti beállítással
Menüpont (főablak XAML)<MenuItem x:Name="miÚj" Header="Új ..." Click="miÚj_Click"/>
Ablak objektum létrehozása és kezdeti beállítások (főablak C#):
var wnd= new wndÚjAdat { Owner= this,
Személy={ Név= "Valaki Eduárd", Átlag= 2}};wndÚjAdat.ShowDialog();
Párbeszédablak megjelenítésewndÚjAdat.ShowDialog();Demo: EgyeniParbeszedAblakJ.Zs.Cs.: Vizuális programozás (c) 2017
56
A pb. ablak osztályában van egy publikus Személy típusú
tulajdonság
Beállítások a párbeszédablak osztályában
J.Zs.Cs.: Vizuális programozás (c) 2017
57
Személy objektum létrehozása az ablak
létrehozásakor
Objektum rácshoz „kötése”
Komplex adatkötés
J.Zs.Cs.: Vizuális programozás (c) 2017
58
Input fókusz és névtérhivatkozás beállítása a megjelenő párbeszédablakban
J.Zs.Cs.: Vizuális programozás (c) 2017
59
Űrlap az alkalmazás főablakában<Window x:Class="Hallgatok.wndFőablak"xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
xmlns:hallgatok="clr-namespace:Hallgatok„
Title="Hallgatói adatok" Height="350" Width="525">…<hallgatok:ucHallgatóAdatrögzítés x:Name="ucHallgatóAdatrögzítés"
Grid.Row="1" Visibility= " Collapsed" /><hallgatok:ucHallgatoAdatmodositas
x:Name="ucHallgatóAdatmódosítás" Visibility="Collapsed"
Grid.Row="1"/>J.Zs.Cs.: Vizuális programozás (c) 2017
60
Megjelenítés - elrejtésprivate void miHallgatóAdatrögzítés_Click(object sender,
RoutedEventArgs e){ ucHallgatóAdatmódosítás.Visibility =
Visibility.Collapsed;ucHallgatóAdatrögzítés.Visibility = Visibility.Visible;
}private void miHallgatóMódosítás_Click(object sender,
RoutedEventArgs e){ ucHallgatóAdatrögzítés.Visibility = Visibility.Collapsed;
ucHallgatóAdatmódosítás.Visibility = Visibility.Visible;}
J.Zs.Cs.: Vizuális programozás (c) 2017
61
Adatátadás párbeszédablakoknak és UserControl-oknak
Hagyományos megoldások Konstruktornak átadott paraméter Értékadás egy tulajdonságnak (akár inicializáló
listában) Osztály létrehozása "Globális célra" és abban
statikus adattagban WPF újdonság
Az alkalmazáshoz kapcsolódó tulajdonság gyűjtemény:
Application.Current.Properties
J.Zs.Cs.: Vizuális programozás (c) 2017
62
Tulajdonság gyűjtemény
J.Zs.Cs.: Vizuális programozás (c) 2017
63
Adatok megjelenítése amikor a komponens (UserControl) láthatóvá válik
private void UserControl_IsVisibleChanged(object sender,
DependencyPropertyChangedEventArgs e){ if(!this.IsVisible) return;
dsHallgatók=Application.Current.Properties["dsHallgatók"] as dsHallgatók;
if (dsHallgatók.dtSzakok.Rows.Count > 1){ cbARSzak.ItemsSource =
dsHallgatók.dtSzakok;cbARSzak.DisplayMemberPath = "Szaknév";cbARSzak.SelectedIndex = 0;
}}
J.Zs.Cs.: Vizuális programozás (c) 2017
64
Bevitt adatok ellenőrzése (Validation)
Miért? Biztonság Későbbi kivételek elkerülése Idejében jelezni a felhasználó felé Teljesítménynövelés (pl. többrétegű
alkalmazásokban a kliens és az alkalmazási rétegek közötti felesleges többszörös adatáramlás elkerülése)
J.Zs.Cs.: Vizuális programozás (c) 2017
65
Hogyan? Az ablak OK gombbal történő lezárásához
eseménykezelőt készítünk, és ott egyenként ellenőrizzük az egyes mezőkbe beírt adatokat. Hiba esetén hibaüzenet és az ablakot nem zárjuk be ha az ablakot már bezártuk, akkor újból
megjelenítjük azt (új objektum példány) user control esetén a uc-t nem rejtjük el.
Ún. validációs szabályok segítségével.
J.Zs.Cs.: Vizuális programozás (c) 2017
66
Validációs szabály Egy osztály ValidationRule leszármazottja Egy adatkötéshez rendeljük – egy objektum egy tagját kötjük a
vezérlő ellenőrizni kívánt tulajdonságához Minden vezérlőhöz szabály, egy vezérlőhöz akár több szabály is using System.Windows.Controls; Validate metódus átdefiniálása
J.Zs.Cs.: Vizuális programozás (c) 2017
67
Komponens ObjektumAdatkötés
Validációs szabály
Tulajdonság Tulajdonság
Validate metódus
J.Zs.Cs.: Vizuális programozás (c) 2017
68
Validációs szabály vezérlőhöz rendelése – XAML kódban
J.Zs.Cs.: Vizuális programozás (c) 2017
69 A rácshoz egy daforrás objektumot fogunk rendelni
futási időben
Validációs szabályok kiértékelése már gépelés
közben
Hibás adatbevitelnél piros keret a szövegmező körül
J.Zs.Cs.: Vizuális programozás (c) 2017
70
A validációs metódusban megadott hibaüzenet megjelenítése
Gyorstippben (buborék - ToolTip)
Egy erre célra beépített vezérlőben (pl. TextBlock)
J.Zs.Cs.: Vizuális programozás (c) 2017
71
Megvalósítás Definiálunk egy osztályt, ami megvalósítja az
IValueConverter interfészt – cél a hibaüzenetek egyetlen sztringbe foglalása
Statikus erőforrásként felvesszük a párbeszédablak XAML leírásába
A szövegmező ToolTip tulajdonságának vagy a kiegészítő vezérlő Text tulajdonságának értékét adatkötéssel a szövegmező hibagyűjteményéből vesszük
Az átalakító osztály gondoskodik a sztringgé alakításról
J.Zs.Cs.: Vizuális programozás (c) 2017
72
Átalakító osztály
using System.Windows.Controls; using System.Windows.Data;
J.Zs.Cs.: Vizuális programozás (c) 2017
73
Statikus erőforrás
<Window.Resources><local:HibaÁtalakító
x:Key="Átalakító" /></Window.Resources>
J.Zs.Cs.: Vizuális programozás (c) 2017
74
Hibaüzenet gyorstippben
J.Zs.Cs.: Vizuális programozás (c) 2017
75
Hibaüzenet TextBlock-ban
J.Zs.Cs.: Vizuális programozás (c) 2017
76
Az OK gomb kezelése
J.Zs.Cs.: Vizuális programozás (c) 2017
77
Egy csomópont alatti összes csomópont hibaállapotának ellenőrzése
J.Zs.Cs.: Vizuális programozás (c) 2017
78