1. .NET ohjelmointi
A-ITY04-2000
kertaus
Timo Tanila
Tampere University of Applied Sciences
2. .NET sovelluskehys
• .NET rakentuu:
– CLR, Common Language Runtime – kerros. Ensisijaisena
tehtävänä on eri tietotyyppien käsittely. Huolehtii useista
matalan tason yksityiskohdista, kuten muistinhallinnasta,
sovellusten ajamisesta, säikeiden käsittelystä, ja suorittaa
erilaisia turvatarkastuksia.
– CTS, Common Type System - kuvaa tietotyypit ja
ohjelmakoodirakenteet, joita runtime tukee
– CLS, Common Language Specification - määrittelee sen
osajoukon tavallisimmista tietotyypeistä ja
ohjelmakoodirakenteista, joika kaikki. NET
ohjelmointikielet tukevat.
• Kaikki .NET kielet käännetään ensin CIL-kielisiksi, Common
Intermediate Language. Vasta CIL kääntäjä tekee binääriä.
3. C# ohjelmointikieli
• Microsoft laati uuden ohjelmointikielen, C# -kielen, erityisesti .NET-alustaa
varten
• C# syntaksi on hyvin samankaltainen Javaan verrattuna. Molemmat
kuuluvat C-kielien perheeseen.
• C# yksityiskohtia:
– Ei osoittimia! C# ohjelmat eivät tyypillisesti tarvitse suoraa osoitin
manipulointia
– Automaattinen muistinhallinta = roskien keräys. Ei tarvitse deallokoida muistia.
– Mahdollisuus käyttää yleisiä tyyppejä, generics <T>. Linkki
– ’partial’ keyword mahdollistaa luokan jakamisen useisiin eri kooditiedostoihin.
– Lambda-ilmaisu yksinkertaistaa delegaattien käyttöä. Mahdollistaa
nimettömän funktion määrittelyn. customers.Where(c => c.City == "London");
– LINQ-kieliset lauseet yksinkertaistavat merkittävästi tietolähteiden ja tiedon
käsittelyä. Linkki
4. Visual Studio 2010 / Useimmiten
käytössä olevat näppäinyhdistelmät
• Ctrl+Space – IntelliSense valinnat
• Ctrl+Tab – selaa avoimia koodi- yms. ikkunoita
• Ctrl+E F – muotoilee valitun koodin
• Ctrl+E C – kommentoi valitun koodin
• Ctrl+E U – poistaa kommentoinnin
• Ctrl+H – Search’n replace valitulle koodille
• Listaus valmiista yhdistelmistä
5. WPF, Windows Presentation Foundation
• Microsoft mainostaa: ”Windows Presentation Foundation (WPF) on tarkoitettu
uuden sukupolven graafisten käyttöliittymien ja sovellusten rakentamiseen, ja saat
tehtyä sen avulla visuaalisesti upeita käyttökokemuksia.”
• WPF:n ydin on vektoripohjainen kuvankäsittelyjärjestelmä, joka on resoluutiosta
riippumaton.
• Osaa hyödyntää nykyaikaisia näytönohjaimia.
• WPF sisältää laajan valikoiman aputoimintoja sovellusten kehittämiseen.
– Extensible Application Markup Language (XAML)
– Kontrollit
– Tietojen sitominen (Data Binding)
– 2D ja 3D grafiikka ja animaatiot
– Tyylit (Styles), mallit (Templates)
• Koska WPF sisältyy Microsoft. NET Framework:iin, on sovelluskehityksessä
hyödynnettävissä koko .NET Framework luokkakirjasto.
6. Yleisimmät WPF kontrollit
• Painikkeet: Button ja RepeatButton.
• Data näytöt: DataGrid, ListView, ja TreeView.
• Päiväys ja sen valinta: Calendar ja DatePicker.
• Valintaikkunat: OpenFileDialog, SaveFileDialog
• Käyttäjän teksti input: TextBox
• Layoutin tekeminen: DockPanel, Grid, GridView, Panel,
ScrollBar, StackPanel, Window,
• Navigointi: Hyperlink
• Valinta: CheckBox, ComboBox, ListBox, RadioButton
• Tietokentät: Label, Popup, ProgressBar, TextBlock, ja ToolTip.
• Menu ja työkalupalkki: Menu, Toolbar,
7. ASP.NET
• ASP.NET on Microsoftin web-kehitysalusta
• ASP.NET-sovellus on kokoelma tiedostoja kuten esimerkiksi C#-koodia,
aspx-tiedostoja, resurssitiedostoja (kuvat jne.), jotka on tallennettu
palvelimelle, yleensä IIS-palvelimelle. (Apachelle Mono-projekti)
• HTTP request/response on se väline, jolla selain ja ASP.NET-sovellus
keskustelevat keskenään. ’Keskustelu’ on HTML-muotoista.
• Esimerkki aspx -> (X)HTML muunnoksesta:
<asp:Button ID=”painike" runat="server"
Text=”Painike" BorderColor="Blue”
BorderStyle="Solid" BorderWidth="5px" />
=>
<input type="submit" name=”painike" value=”Painike"
id=”painike” style="border-color:Blue;border-
width:5px;border-style:Solid;" />
• Visual Studiolla kun kehitetään ASP.NET sovelluksia, on yleensä oikean IIS-
palvelimen sijasta käytössä Visual Studio Development Server.
8. Silverlight
• Silverlight-applikaatioiden kehittäminen on hyvin
samankaltaista kuin WPF applikaatioidenkin. Silverlight
tarjoaa kuitenkin vain osan WPF:n ominaisuuksista ja
luokkakirjastoista käyttöön.
• Silverlight-sovellusta voi ajaa missä tahansa modernissa
selaimessa, kunhan Silverlight plug-in löytyy (kuten
IE, Firefox, Google Chrome tai Safari).
• Tyypillisesti ASP.NET-verkkosovelluksessa on mukana
Silverlight-applikaatioita.
• On myös mahdollista ajaa Silverlight-sovellusta selaimen
ulkopuolella muissakin käyttöjärjestelmissä kuin
Windowsissa. Riittää, että Silverlight runtime on asennettu.
(Linux, Mac OS, ...).
• Silverlightin tavoitteena on tarjota vaihtoehto Adoben
Flashille.
9. XAML (Extensible Application Markup Language),
Yleistä
• XAML on merkintäkieli, jolla voi esitellä ja alustaa .NET olioita
• XAMLia voi soveltaa monissa eri tarkoituksissa, mutta ensisijaisesti
se on tarkoitettu WPF-käyttöliittymien rakentamiseen (Käytössä
kuitenkin myös Silverlight ja ASP.NET -kehityksessä)
• XAML tiedostossa voidaan siis määritellä käyttöliittymä
asetteluineen, painikkeineen ja muine kontrolleineen jne.
• XAMLia voi kirjoittaa käsin tai käyttää sen generoimiseen
työkaluja, esimerkiksi Visual Studion designeria toolboxeineen tai
Expression Blend ohjelmaa. Yksi XAMLin tarkoitus onkin, että
sovelluskehitystyö voidaan helpommin jakaa graafikoiden ja
ohjelmoijien kesken = ohjelmoija tekee code-behindin ja graafikko
XAMLin.
• Kuitenkin, ohjelmoijana on useimmiten helpompaa kirjoittaa
XAMLia käsin, ainakin viimeistellä se käsin, jotta saa aikaan
halutunlaisen lopputuloksen.
10. XAML (Extensible Application Markup Language),
Yleistä
• XAML ei ollut vielä käytössä aiemmin Windows Forms
– applikaatiokehityksessä. Kaikki käyttöliittymäkoodi oli
tehtävä C#-koodina.
• Huom. WPF applikaatioitakin voi koodata ilman
XAMLia, tekemällä kaikki koodi C#.koodina kuten
ennenkin. Se ei ole kuitenkaan tarkoituksenmukaista.
• WPF sovelluskehityksessä kääntäjä muuttaa XAML-
koodin BAML-koodiksi (Binary Application Markup
Language) ja lisää BAMLin mukaan applikaation
resurssiksi. Ajonaikana on nopeampaa tulkita
binäärimuotoista merkintäkieltä.
11. XAML (Extensible Application Markup Language),
Rakenne
• Jokainen elementti XAML merkintäkielessä vastaa
jotakin .NET luokkaa. Ne on nimetty siis tarkalleen
samalla nimellä.
• XAMLin elementti <Button> aiheuttaa siis sen, että
kääntäjä luo WPF sovellukseen Button olion.
• Kuten XML-dokumenteissakin, XAMLissakin voi
kirjoittaa sisäkkäisiä elementtejä. Siis käytännössä, jos
esim. DockPanel -elementin sisälle on kirjoitettu
Button, on käyttöliittymän DockPanel osiossa jossain
kohtaa Button.
• XAMLissa voi alustaa olioiden propertyjä.
12. XAML (Extensible Application Markup Language),
Rakenne
• XAML tiedostossa on aina yksi ylimmän tason elementti, joka on
esimerkiksi WPF sovelluksissa:
– Window
– Application
• Se, että on yksi ylimmän tason elementti tarkoittaa siis käytännössä
sitä, että kun kirjoittaa sulkevan elementin, esim. </Window>, ei sen
perään voi kirjoittaa enää uusia elementtejä.
• XAML kääntäjän täytyy myös tietää missä on määritelty XAMLissa käytetyt
luokat, joten nimiavaruudet on merkitty XAMLin ensimmäiseen
elementtiin tageilla, esim. ’xmlns’. (Huom. Notaatio muistuttaa
webbilinkkiä). Näin XAML kääntäjä löytää esim. Window-luokan jne.
– *presentation, sisältää WPF luokat kuten kontrollit yms.
– *xaml, sisältää XAML tulkaukseen liittyviä luokkia (huom. mäpätty x:llä)
• Oma luokka, jonka osa XAML tiedosto on, on merkitty x:Class tagilla
(’partial’ avainsana tarvitaan code-behindissa, koska osa luokan
määrittelystä on XAMLissa)
13. Käyttöliittymän tekeminen / container-luokat
• Aiemmin Windows Forms -sovelluksia tehtäessä oli käytössä
koordinaatteihin perustuva asettelu.
– Todellinen haaste oli varmistaa, että ulkoasu pysyi hyvännäköisenä, vaikka
ikkunan kokoa muutettiin.
• WPF sovelluksissa on käytössä muutama erilainen ’container’-luokka,
joiden avulla käyttöliittymän elementtejä voi sijoitella ja asetella kätevästi.
• Asettelun saa tehtyä helposti sellaiseksi, että ikkunan koon muuttaminen
pitää ulkoasun ryhdissä.
• ’container’-luokat voidaan mieltää säiliöiksi, joiden sisälle varsinaiset
kontrollit ja datataulut ym. loppukäyttäjälle näkyvät elementit asetellaan.
• Ideana on, että kun kontrollit on aseteltu ’containereihin’, ei ole tarpeen
asettaa itse kontrollin kokoa tai koordinaattia kiinteäksi.
• Kaikki containerit periytyvät ’Panel’ -luokasta.
• Tärkeimmät asetteluun tarkoitetut container-luokat ovat:
– StackPanel
– WrapPanel
– DockPanel
– Grid
14. Data Binding
• ’Data Binding’ eli tietojen sidonta tarkoittaa,
että on olemassa lähde- ja kohdeobjektien
välille tehty sidonta, joka kertoo systeemille,
että lähdeobjektista tulee asettaa jotakin
tietoja kohdeobjektiin.
• Kohdeobjekti on aina ’dependency property’.
• Tärkein käyttötarkoitus sovelluksissa on jonkin
tiedon näyttäminen käyttöliittymässä.
• Lähdeobjekti voi olla melkein mitä tahansa,
kuten toinen elementti tai jokin tietorakenne.
15. Tietorakenteet
• Visual C# tarjoaa useita erilaisia
tietorakenteita. Sopivan tietorakenteen valinta
riippuu luonnollisesti käyttötarkoituksesta.
– Käytännössä muutaman osaaminen riittää jo
pitkälle: lista (List<T>), hash (Hashtable).
• Kun tietorakenne on olemassa, sitä voidaan
käsitellä todella näppärästi LINQ-lauseilla.
16. List<T>
• Tyypitetty indeksoitu lista. Tarjoaa valmiiksi runsaasti metodeja esim.
listan alkioiden etsimiseen, lajitteluun, käsittelyyn jne.
• List<T> -luokka pohjautuu ArrayList-luokkaan.
• List<T> luokan alkioita voidaan verrata keskenään. Oleellista on, että
<T>, siis listan alkioiden tietotyyppi, toteuttaa tarvittavia rajapintoja:
IEquatable<T> rajapintaa vertailutoiminnolle Equals<T> (Jos tyyppi ei tue
tätä rajapintaa, niin käyttää yleistä Object.Equals(Object) vertailua).
IComparable<T> rajapinta tarpeen, jos esim. lajitellaan (Sort), jotta
käytössä CompareTo –metodi.
• Kuten ArrayList-listassakin:
– Lista ei ole oletusarvoisesti missään tietyssä järjestyksessä. Lajittele lista ennen
käyttöä, jos tarpeen.
– Listan alkioita voidaan käsitellä indeksin kautta, joka alkaa 0:sta.
– Listassa voi olla saman alkion duplikaatteja.
• Tärkeä ero ArrayList-listaan on, että List<T> -listan alkioina voi olla vain
samantyyppisiä alkioita => yleensä hyödyllinen ominaisuus.
17. Hashtable
• Hashtable on kokoelma avain/arvo-pareja, jotka järjestetään
avaimen perusteella.
• Jokainen hash-taulun elementti on avain/arvo-pari, joka on
tallennettu DictionaryEntry objektiin.
• Avain täytyy olla määritelty. Taulussa ei ole duplikaatteja samalla
avain-arvolla.
• Avain-arvoja ei voi muuttaa sen jälkeen kun ne on asetettu.
• Hash-taulu on tehokas tietorakenne, vaikka kyseessä olisi hyvin
suurikin taulu. Kunhan avain tiedetään, saadaan elementti haettua
nopeasti.
• Hash-taulun koko kasvaa dynaamisesti kun uusia elementtejä
lisätään.
• Foreach-lauseessa C#-kielellä saadaan yksi kerrallaan jokainen
DictionaryEntry – ei siis suoraan arvoja.
18. LINQ
• Sovellukset käyttävät tyypillisesti monenlaisia tietovarastoja
toiminnoissaan. Tieto voi olla esimerkiksi XML-tiedostoissa,
relaatiotietokannoissa tai erilaisissa sovelluksen sisäisissä
tietorakenteissa kuten listoissa tai taulukoissa ym.
• Perinteisesti ohjelmoijan on tarvinnut käyttää eri tyyppisiä
tietolähteitä varten eri rajapintoja ja tehdä tiedon luku- ja
kirjoitustoiminnot tietolähteen määräämällä tavalla.
• Language Integrated Query (LINQ)-tekniikka tuli mukaan
.NET 3.5 versiossa, joten se on suht tuore lisäominaisuus
.NET ympäristöön ja C# kieleen. (.NET 3.5 julkaistiin 2007
lopulla). LINQ-lauseet helpottavat tietolähteiden käyttöä
merkittävästi.
19. LINQ ’rakennuspalikat’
• C# -kieleen on määritelty muutama LINQ-
lauseisiin liittyvä apuominaisuus:
– Implisiittisesti määritellyt paikalliset muuttujat
– Objektin / kokoelman alustussyntaksi
– Lambda-ilmaisu
– ’Extension Methods’
– Anonyymit tyypit
20. Implisiittisesti määritellyt paikalliset
muuttujat
• ’var’ avainsanan avulla voi esitellä
muuttujan, jonka tyyppiä ei ole määritelty
• Tyyppi on kuitenkin määritelty sen jälkeen, kun
kääntäjä huomaa, että muuttujaa käytetään
ensimmäistä kertaa = kääntäjä määrittelee ja
asettaa sopivan tyypin
• Muuttujan tyyppiä ei siis voi vaihtaa enää tämän
jälkeen toiseksi
• LINQ-lauseissa on yleensä tarpeen, että kääntäjä
saa määritellä sopivan tyypin.
• demo
21. Objektin / kokoelman alustussyntaksi
• Alustussyntaksi mahdollistaa luokan olion tai
tietorakenteen alustamisen helposti yhdellä
lauseella.
• Alustussyntaksin käyttäminen on
’vapaaehtoista’ eli alustus voidaan toki tehdä
perinteiseen tapaan rakentajan avulla tai
asettamalla alkuarvot yksitellen.
• Kuitenkin, alustussyntaksi tekee koodista
luettavampaa ja tiiviimpää
• demo
22. Lambda-ilmaisu
• C# Lambda-ilmaisun avulla voidaan rakentaa
’delegaatti’. Siis tilanteessa, jossa jokin metodi vaatisi
parametrina delegaatin, voimmekin käyttää lambda-
ilmaisua.
• Lambda-ilmaisun käyttäminen yleensä yksinkertaistaa
kirjoitettavan koodin ulkoasua ja määrää.
• Lambda-ilmaisu koostuu käytännössä:
(arg1,arg2,...) => koodi
• Lambda-ilmaisun käyttö selkeyttää erityisesti LINQ-
lauseita
• demo
23. ’Extension Methods’
• ’Extension Methods’ien avulla voi tehdä laajennuksen
johonkin olemassa olevaan luokkaan ilman uuden
aliluokan tekemistä.
• Lisäksi, voit lisätä uusia toimintoja sinetöityihin
(’sealed’) luokkiin ja rakenteisiin, joita ei siis voida
periä.
• Käytännössä ’Extension Methods’it pitää aina
määritellä ’static’ avainsanaa käyttäen
• ’Extension Methods’-määrityksiä ei yleensä tarvitse
tehdä LINQ-lauseille, mutta on hyvä tietää, että LINQ-
lauseissa on niitä yleensä tietämättämme käytössä
Microsoftin tarjoamina
• demo
24. Anonyymit tyypit
• Anonyymin tyypin avulla voidaan mallintaa
uusi dataluokka ilman varsinaista
luokkamäärittelyä.
• Kääntäjä luo uuden luokan käännösvaiheessa
• Tätä ominaisuutta käytetään paljon LINQ-
lauseissa, kun olemassa olevasta dataluokasta
otetaan vaikkapa vain osa jäsenmuuttujista
talteen
• demo
25. LINQ operaattorit
from, in Käytetään määrittelemään LINQ-ilmaisun kohdeobjektit
where Käytetään määrittelemään ehdot, joilla haluttu osajoukko
saadaan
select Käytetään halutun osajoukon valitsemiseen jatkotoimenpiteitä
varten
join, on, equals, Käytetään toisen tietolähteen liittämiseen samaan LINQ-
into lauseeseen
orderby, ascending, Käytetään valitun osajoukon lajitteluun
descending
group, by Käytetään valitun osajoukon ryhmittelyyn
26. Tapahtuma (’Event’),
Yleistä .NET ’eventeistä’
• ’Event’ on C#-kielen keino välittää oliolle
tapahtunut asia muille siitä kiinnostuneille olioille
(’client’).
• Tyypillisesti ’event’ on keino välittää jokin
käyttöliittymän tapahtuma muille ohjelman osille.
• ’Eventtejä’ voi toki käyttää muutenkin,
esimerkiksi välittämään jokin tilanne tai
tapahtuma käyttöliittymän ulkopuoleltakin.
• ’Eventtien’ toteutus perustuu delegaatteihin.
• Jokaisen ’Eventin’ argumentit periytyvät
EventArgs luokasta. (Esim. MouseEventArgs)
27. ’Routed Events’
• Routed Event -tapahtumia reititetään tietyssä
järjestyksessä elementiltä toiselle.
• Kun tapahtuma on käsitelty, se voidaan
merkitä käsitellyksi.
• Voimme siis käytännössä käsitellä tapahtuman
siinä kohtaa ohjelmaamme kuin haluamme.
• Jotta voimme käsitellä tapahtuman, meidän
täytyy tehdä tapahtumankäsittelijä (event
handler).
28. ’Routed Events’,
WPF
’Routed event’ tapahtumia on kolmea eri tyyppiä:
1. Suorat tapahtumat, ’direct events’:
– Nämä ovat tavanomaisia .NET eventtejä eli ne ovat peräisin yhdestä
elementistä eikä niitä välitetä muualle. Esimerkiksi ’MouseEnter’ event on
tällainen tapahtuma – se on yhden elementin tapahtuma, kun hiiren osoitin
siirtyy elementin päälle.
2. Nousevat tapahtumat, ’bubbling events’:
– Nämä tapahtumat lähtevät liikkeelle kohde-elementistä, mutta nousevat
hierarkiassa ylöspäin. Esimerkiksi MouseDown on nouseva tapahtuma eli se
tulee ensin elementille, jota napsautetaan. Seuraavaksi se nousee hierarkiassa
ylös eli jos Button on StackPanelin sisässä, niin Buttonin jälkeen StackPanelille.
Tapahtuma nousee ylimmälle tasolle asti, joka siis usein Window.
3. Tunneloidut tapahtumat, ’Tunneling events’:
– Nämä kulkevat vastaavasti ylhäältä alas, päätyen lopulta kohde-
elementtiin, siis esim Button. Tarkoituksena on, että yläpuoliset elementit
voivat käsitellä tapahtuman ensin ja olla vaikkapa päästämättä eventtiä kohde-
elementille asti. Esimerkiksi PreviewKeyDown on tällainen ja kaikki ’Preview*’
eventit.
29. Liitännäistapahtumat, ’attached events’
• Nouseva tapahtuma ’bubbling event’ on
mahdollista käsitellä hierarkian yläpuolella
vain, jos tapahtuma on sellainen, jota yläpuoliset
elementit tukevat.
• Entä jos tapahtuma on sellainen, että vain
kyseinen kontrolli tukee sitä? Löytyykö
StackPanelista esimerkiksi Click-tapahtumaa?
• Jos StackPanelissa on useita painikkeita ja
haluamme käsitellä Click-tapahtuman yhteisesti
StackPanel-tasolla, tulee avuksi ’attached event’.
• Esim. ButtonBase.Click on siis ButtonBase
luokasta, josta Button periytyy.
30. Elementin elinkaareen liittyvät tapahtumat,
’Lifetime events’
• Initialized
– Tämä lähetetään kun elementin olio on luotu
• Loaded
– Tämä lähetetään kun elementti, esim. ikkuna
(Window), on muuten valmis, mutta ei vielä piirretty
näytölle
• Unloaded
– Tämä lähetetään kun kyseinen elementtiolio
vapautetaan eli kun koko ikkuna suljetaan tai kyseinen
elementti poistetaan ikkunasta
• Nämä kolme ovat kaikille elementeille
yhteisiä, lisäksi on elementtikohtaisia
elinkaaritapahtumia.
31. Syötteeseen liittyvät tapahtumat, ’Input events’
• Keyboard
– Näppäimistöstä Keydown, TextInput, KeyUp ja
niiden Preview vastineet
• Mouse
– Hiiren käytöstä lukuisia esim.
MouseMove, MouseWheel, Mouse*Button*, Mou
seDoubleClick, jne. Ja Preview-vastineet
• Stylus
– Tablet PC:n kynälle tarkoitettuja
• Multitouch
– Tuettu vain Windows 7 ja jatkossa ?.
32. Tyylit (Styles),
Yleistä
• Tyylit ovat väline, joilla saa määritettyä
yhteisiä tyyliohjeita, joita voi käyttää
applikaatiossaan useammassa kuin yhdessä
paikassa.
• Meidän ei siis tarvitse määritellä XAMLissa
tyyliä jokaiselle kontrollille tai muulle
elementille erikseen.
• Tyyleillä voidaan määritellä marginaalit,
taustat, värit ja fontit jne.
33. Tyylit (Styles),
WPF
• WPF:n tyylien idea on samanlainen kuin
Cascading Style Sheets (CSS)-tyylien, joita
käytetään paljon web-kehityksessä.
• Kuten CSS-tyyleilläkin, myös WPF tyyleillä voit
määrittää applikaatiolle yhteisiä tyylejä.
• Edelleen CSS:n kaltaisesti, WPF tyylit voit
kohdistaa automaattisesti tiettyihin
elementteihin tai tiettyyn osioon.
• WPF tyylit tukevat herätteitä (Triggers), joiden
avulla voit aktivoida tyylin kun jokin toinen
elementti muuttuu esim. Käyttäjä clikkaa
kontrollia tms.
34. Shapes
• Yksinkertaisin tapa tehdä 2-D graafista sisältöä
käyttöliittymään on käyttää muotoelementtejä
(Shapes)
• Ne ovat luokkia, jotka edustavat yksinkertaisia viivoja,
ellipsejä, suorakulmioita ja monikulmioita.
• Näitä yhdistelemällä voi tehdä toki
monimutkaisempaakin grafiikkaa.
• Oleellista muotoelementeistä:
– Luokkia, jotka osaavat piirtää itse itsensä
– Muotoelementtejä voi asetella containereihin. Usein
muotojen kanssa hyvä container on ’Canvas’, koska sen
sisällä muotoja voi asettaa koordinaateilla.
– Muotoelementit tukevat samoja tapahtumia (events) kuin
muutkin valmiit elementit
35. Brushes ja Transform
• Täytevärin (Brush-luokka) voi asettaa kiinteäksi
tai liukusävyllä
– SolidColorBrush
– LinearGradientBrush
– RadialGradienBrush
• Transform-luokkien avulla voidaan muokata
muotoelementtejä.
37. Applikaatio luokka,
WPF
• Käynnissä oleva WPF sovellus edustaa yhtä ilmentymää
System.Windows.Application –luokasta
• Application –olio seuraa kaikkia avoimia ikkunoita ja
kontrolloi sovelluksen sulkemista ja lähettää
sovellukseen liittyviä elinkaaritapahtumia (event).
• Visual Studio generoi meille valmiiksi Main-metodin (ja
muutakin) kun aloitamme uuden WPF projektin.
– Uudessa WPF projektissa tiedostossa:
/obj/x86/Debug/App.g.i.cs
• StartupUri-propertyllä kerrotaan pääikkuna eli meidän
ei tarvitse itse kirjoittaa pääikkunan käynnistyskoodia.
38. Applikaation kontrollointi
• Voimme asettaa Application-oliomme sulkeutumislogiikan
ShutDownMode propertyllä:
– OnLastWindowClose, oletusarvo
– OnMainWindowClose
– OnExplicitShutDown, täytyy kutsua Application.Shutdown() –metodia
(joka toimii aina)
• Applikaatiolla on elinkaaritapahtumia (events), joille voi tehdä
käsittelijät. Esim. Startup, Exit, Activated, Deactivated, ym.
(kokeillaan)
• Voimme myös ylikirjoittaa näiden eventtien lähetykseen liittyvät
metodit. Metodin nimi on sama kuin tapahtuman nimi siten, että
siinä on etuliite eli Startup-metodi on OnStartup(), Exit-metodi on
OnExit(), ja niin edelleen. (BTW, tämä nimeämiskäytäntö on yleinen
.NET-ympäristössä. Poikkeuksia kuitenkin on eli ihan jokaiselle
eventille ei välttämättä ole vastaavaa metodia – ei esim.
DispatcherExceptionUnhandled -tapahtumalle)
• Sovelluksen komentoriviargumentit voisimme käsitellä Application-
luokan Startup-tapahtumakäsittelijässä.
39. Useita ikkunoita
• Applikaatiolla voi olla auki useita ikkunoita
• Ikkunoiden hallintaa helpottaa staattinen
Application.Current property.
– Kaikilla ikkunoilla on mahdollisuus käyttää Application.Current
propertyä ja käsitellä sen ’MainWindow’ ja ’Windows’ tietoja
• Käytännössä sovellukset tarvitsevat usein kommunikointia
ikkunoiden välillä ja tämä vuorovaikutus täytyy toteuttaa
jotenkin.
• Pitkäikäisten ikkunoiden välinen kommunikointi voi olla
järkevää toteuttaa tekemällä oma Application-luokka
toteutus, joka hallitsee ikkunoita, siis esimerkiksi tuo esiin
oikeat ikkunat oikealla hetkellä jne.
• Huom. Muista, että omaa ikkunaa ei ole tarpeen rakentaa
joka asialle -> löytyy esim. valmiita dialogeja ym.
40. Window- luokka,
Yleistä
• Ikkunat ovat jokaisen työpöytäsovelluksen
käyttöliittymän runko. (kuten ASP.NET
sovelluksissa sivut)
• Vaikka WPF sovelluksen voisi tehdä vain yhtä
ikkunaa käyttäen ja kontrolleja dynaamisesti
vaihtaen, on ikkunoiden tekeminen useimmiten
oikeampi ja käytettävämpi toteutustapa.
• Ikkunoita voidaan hallita hyvin vapaasti
käyttöliittymässä: Niitä voidaan näyttää ja
piilottaa halutulla tavalla, niiden sijaintia voidaan
muuttaa, ulkonäköä ja tyyliä vaihdella jne.
41. Window- luokka,
Yleistä
• Window-luokka periytyy ContentControl-
luokasta.
• Tämä tarkoittaa, että Window-olio voi sisältää
yhden lapsiolion (yleensä Container
esimerkiksi Grid).
• Sisältää tuttuja propertyjä:
Background, BorderBrush, BorderThickness.
42. Window- luokka,
Propertyjä
• Window-luokan omia propertyjä:
– AllowsTransparency
• Aseta ’true’ jos tarkoituksena tehdä osittain läpinäkyvä ikkuna. (Background ’Transparent’ ja
WindowStyle ’None’)
– Icon
• Pieni ikoni ikkunaa varten
– Top, Left
• Ikkunan paikka
– ResizeMode
• Tällä voi vaikka estää ikkunan koon muuttamisen kokonaan
– ShowInTaskbar
• Yleensä aktiivinen vain pääikkunalle
– SizeToContent
• Ikkuna muuttaa kokoaan sisällön koon mukaan
– Title
• Ikkunan otsikko
– Topmost
• Tällä saa ikkunan pysymään muiden kyseisen applikaation ikkunoiden päällä
– WindowStartupLocation
• Ikkunan paikka kun uusi ikkuna avataan
– WindowState
• Kertoo onko ikkuna esim minimoitu ’task bar’:iin
– WindowStyle
• Ikkunan tyylin valinta tietyistä valmiista tyyleistä
43. Window- luokka,
Metodeja
• Ikkunan näyttäminen:
– Show()
• Ei blokkaa, ’modeless window’
– ShowDialog()
• Blokkaa, ’modal window’. DialogResult –propertyllä
voimme palauttaa jonkin dialogin paluuarvon, jos
haluamme.
– Activate()
• Saadaan aktivoitua haluttu ikkuna. Huom. IsActive
property kertoo meille, onko ikkuna aktiivinen.
45. ASP.NET sovellus
• ASP.NET hyödyt verrattuna HTML-kehitykseen
– Mahdollisuuden palvelimella ajettavaan koodiin ja
koodin laittamisen code behindiin = käyttöliittymä
XAMLina ja muu toiminta esim. C#-koodina.
• Helppo uudelleen käyttää C#-koodia
– Käyttöliittymän rakentaminen on samantapaista
kuin esim. WPF kehitys, ja käytössä esim. monia
WPF kehittäjille tuttuja kontrolleja yms.
– Data Binding –systeemi
– Mahdollisuuden MVC-arkkitehtuurin (Model-
View-Controller, esimerkki 2) käyttöön.
46. ASP.NET
Global.asax
• Sisältää ’Global’-luokan, joka periytyy HttpApplication-luokasta
• Luokka sisältää tapahtumakäsittelijät:
– Application_Start()
• Kutsutaan kun web-sovellus käynnistetään. Ajetaan siis kerran web-
sovelluksen elinkaaren aikana. Voisimme alustaa täällä jotain sovellukseen
liittyviä pysyviä tietorakenteita yms.
– Application_End()
• Kutsutaan, kun sovellus suljetaan.
– Session_Start()
• Ajetaan kun uusi käyttäjä saapuu. Täällä voisimme siis luoda
käyttäjäkohtaisia tietorakenteita tms.
– Session_End()
• Ajetaan kun käyttäjän istunto on päättynyt (usein siis aikakatkaisun takia).
– Application_Error()
• Kutsutaan kun web-sovellukselta tulee käsittelemätön poikkeus.
• Täällä olisi fiksua ottaa kiinni siis käsittelemätön poikkeus:
– Server.GetLastError() -> käsittely -> Server.ClearError();
47. ASP.NET sivu
• ASP.NET Page luokka
– Periytyy Control luokasta
– Oleelliset propertyt:
• Application
– Applikaatiotason dataobjekti, jota voidaan käyttää miltä tahansa sivulta
• Cache
– Välimuisti
• IsPostBack
– Osoittaa, onko sivu ladattu ensimmäistä kertaa
• MasterPageFile
– Määrittää kyseisen sivun pohjan
• Request
– Tarjoaa pääsyn nykyiseen HTTP pyyntöön
• Response
– Voit vaikuttaa lähtevään HTTP-vastaukseen
• Server
– Tarjoaa pääsyn HttpServerUtility objektiin, joka sisältää useita palvelimen aputoimintoja
• Session
– Voit tallentaa ja lukea istunnon tietoja
• Theme
– Teema nykyiselle sivulle
• Trace
– Treisaus
48. ASP.NET sivu
• Sivun elinkaari, tärkeimmät eventit
– PreInit
• Tässä vaiheessa tehdään sivupohja. Tarpeen ottaa kiinni, jos täytyy päästä
tekemään jotain ennen kuin suoritus etenee.
– Init
• Tässä vaiheessa alustetaan kontrollit ja niiden propertyt edellisiin arvoihin
– Load
• Tähän tultaessa on sivu jo alustettu, joten voimme käsitellä sivun elementtejä
ym.
– <nykyinen event käsitellään>
• Tulee siis käsittelyyn se tapahtuma, joka aiheutti selaimen tekemään
postbackin
– PreRender
• Tapahtumat on käsitelty ym. ja aloitetaan sivun renderöiminen Responseen.
– Unload
• Sivu on renderöity ja HTTP Response tehty. Page-olio voidaan tuhota. Tässä
voisimme vielä sulkea tiedostoja tai tietokantayhteyksiä ym.
• Sivun virhetilanteiden/poikkeuksien käsittely:
– Sivun virheet voi ottaa kiinni Page_Error tapahtumakäsittelijällä
49. ASP.NET sivun tila
• HTTP protokolla ei tue web-sovelluksen tilatiedon
ylläpitämistä
– ASP.NET Page-olio tuhotaan aina jokaisen yksittäisen
sivunmuodostuksen jälkeen.
• Web-kehitys on siis hyvin erilaista verrattuna
paikallisten sovellusten, esimerkiksi
työpöytäsovellusten kehitykseen, joissa ohjelman
tila tyypillisesti säilyy koko suorituksen ajan.
• Tilatiedon ylläpitäminen ei ole pelkästään
ASP.NET sovellusten ongelma, vaan koskee kaikkia
web-kehitysalustoja kuten Java Web sovelluksia ja
PHP sovelluksia ym., joissa tilanhallinta täytyy
kaikissa toteuttaa jotenkin
50. ASP.NET
ViewState
• ASP.NET runtime lisää automaattisesti piilotetun
lomakekentän (nimeltään __VIEWSTATE) mukaan
muodostamalleen sivulle. Se sisältää nimi/arvo
pareja, joilla sivulla olevien elementtien sisältö
saadaan täytettyä automaattisesti postbackien
välillä.
– __VIEWSTATE on Base64-koodattu merkkijono
• System.Web.UI.Page luokan Init-
tapahtumankäsittelijä lukee__VIEWSTATE –arvot
ja päivittää arvot Page-olioon.
– Tämän takia elementtien arvoja ei kannata käsitellä
itse vielä Init-vaiheessa.
51. ASP.NET
Cache
• Cache eli välimuisti tarjoaa joustavan tavan käsitellä web-
sovelluksen sisäistä tietoa
• Välimuistissa voi säilyttää tietoja tietyn ajanjakson ajan.
Voisimme esimerkiksi säilyttää tietokannasta haettua dataa
voimassa muutaman minuutin ja hakea datan uudelleen
vasta sen jälkeen.
• System.Web.Caching.Cache (saatavilla Context.Cache
kautta)
• Välimuistin dataobjektit ovat kaikkien käyttäjien ulottuvilla
kaikilta sivuilta kiinteän ajan.
– Jos data ei ole enää Cachessa kun yritämme sitä lukea, palautuu
’null’.
• Käytännössä välimuistiin asetetaan dataa käyttämällä Cache-luokan
Insert-metodia. Voimme asettaa datan voimassaoloajan ja oman
tapahtumankäsittelijän datan vanhentumiselle.
52. ASP.NET
Session
• Session on käyttäjäkohtainen
• Yksi istunto on siis tietyn käyttäjän vuorovaikutusta
web-sovelluksemme kanssa
– HttpSessionState
• Tietyn käyttäjän Session-data voitaisiin alustaa
Application-tasolla (Global.asax).
– Klassinen esimerkki käyttäjädatan säilyttämisestä on
verkkokaupan ostoskorin säilyttäminen istuntojen välillä.
• Sessioilla on automaattisesti uniikki Session ID, joka
yksilöi olemassaolevan HttpSessionState-oliot
(istunnot), ja voimassaoloaika (oletus 20 min), jonka
voimme asettaa, Session.Timeout. (tämän voi vaihtaa
myös kaikille käyttäjille Web.configin kautta)
53. ASP.NET
Cookie
• Yksi tapa säilyttää tilatietoa on eväste (Cookie)
• Se on usein toteutettu tekstitiedostona (tai
joukkona tiedostoja), jotka on tallennettu
käyttäjän koneelle.
• Kun käyttäjä siirtyy tietylle sivustolle, selain
tarkistaa, onko käyttäjän koneella eväste
kyseiselle Urlille, ja jos on, selain liittää tiedot
HTTP pyyntöön.
• Vastaanottava palvelin voi lukea evästeen tiedot
ja luoda sivun tallennettuihin tietoihin perustuen.
• Evästeet ovat tekstitiedostoja. Ne ovat siis huono
paikka arkaluontoisille tiedoille. (kuten
luottokortin numero ym.)
54. .NET kurssin loppusanat
• Ohjelmointi on hauskaa: Myös .NET ohjelmointi
• Ohjelmoinnin oppiminen vaatii työtä: Vasta itse
tekemällä ja kokeilemalla (ja työn kautta) oppii
ohjelmoimaan.
• Ohjelmistokehittäjän työura on jatkuvaa uuden
oppimista: Kuten useimpiin muihinkin
ohjelmistotekniikoihin, myös .NET ohjelmointiin
kehitetään uusia asioita jatkuvasti.