net ohjelmointi kertaus

54
.NET ohjelmointi A-ITY04-2000 kertaus Timo Tanila Tampere University of Applied Sciences

Upload: timo-tanila

Post on 09-Jun-2015

2.292 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Net ohjelmointi kertaus

.NET ohjelmointiA-ITY04-2000

kertaus

Timo TanilaTampere University of Applied Sciences

Page 2: Net ohjelmointi kertaus

.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ä.

Page 3: Net ohjelmointi kertaus

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

Page 4: Net ohjelmointi kertaus

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ä

Page 5: Net ohjelmointi kertaus

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.

Page 6: Net ohjelmointi kertaus

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,

Page 7: Net ohjelmointi kertaus

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 .

Page 8: Net ohjelmointi kertaus

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.

Page 9: Net ohjelmointi kertaus

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.

Page 10: Net ohjelmointi kertaus

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ä.

Page 11: Net ohjelmointi kertaus

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ä.

Page 12: Net ohjelmointi kertaus

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)

Page 13: Net ohjelmointi kertaus

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

Page 14: Net ohjelmointi kertaus

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.

Page 15: Net ohjelmointi kertaus

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.

Page 16: Net ohjelmointi kertaus

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.

Page 17: Net ohjelmointi kertaus

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.

Page 18: Net ohjelmointi kertaus

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.

Page 19: Net ohjelmointi kertaus

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

Page 20: Net ohjelmointi kertaus

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

Page 21: Net ohjelmointi kertaus

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

Page 22: Net ohjelmointi kertaus

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

Page 23: Net ohjelmointi kertaus

’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

Page 24: Net ohjelmointi kertaus

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

Page 25: Net ohjelmointi kertaus

LINQ operaattoritfrom, 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, into

Käytetään toisen tietolähteen liittämiseen samaan LINQ-lauseeseen

orderby, ascending, descending

Käytetään valitun osajoukon lajitteluun

group, by Käytetään valitun osajoukon ryhmittelyyn

Page 26: Net ohjelmointi kertaus

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)

Page 27: Net ohjelmointi kertaus

’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).

Page 28: Net ohjelmointi kertaus

’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.

Page 29: Net ohjelmointi kertaus

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.

Page 30: Net ohjelmointi kertaus

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.

Page 31: Net ohjelmointi kertaus

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*, MouseDoubleClick, jne. Ja Preview-vastineet

• Stylus– Tablet PC:n kynälle tarkoitettuja

• Multitouch– Tuettu vain Windows 7 ja jatkossa ?.

Page 32: Net ohjelmointi kertaus

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.

Page 33: Net ohjelmointi kertaus

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.

Page 34: Net ohjelmointi kertaus

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

Page 35: Net ohjelmointi kertaus

Brushes ja Transform

• Täytevärin (Brush-luokka) voi asettaa kiinteäksi tai liukusävyllä– SolidColorBrush– LinearGradientBrush– RadialGradienBrush

• Transform-luokkien avulla voidaan muokata muotoelementtejä.

Page 36: Net ohjelmointi kertaus

WPF spesifinen osuus

Page 37: Net ohjelmointi kertaus

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.

Page 38: Net ohjelmointi kertaus

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ä.

Page 39: Net ohjelmointi kertaus

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.

Page 40: Net ohjelmointi kertaus

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.

Page 41: Net ohjelmointi kertaus

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.

Page 42: Net ohjelmointi kertaus

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ä

Page 43: Net ohjelmointi kertaus

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.

Page 44: Net ohjelmointi kertaus

ASP.NET spesifinen osuus

Page 45: Net ohjelmointi kertaus

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.

Page 46: Net ohjelmointi kertaus

ASP.NETGlobal.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();

Page 47: Net ohjelmointi kertaus

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

Page 48: Net ohjelmointi kertaus

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ä

Page 49: Net ohjelmointi kertaus

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

Page 50: Net ohjelmointi kertaus

ASP.NETViewState

• 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.

Page 51: Net ohjelmointi kertaus

ASP.NETCache

• 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.

Page 52: Net ohjelmointi kertaus

ASP.NETSession

• 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)

Page 53: Net ohjelmointi kertaus

ASP.NETCookie

• 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.)

Page 54: Net ohjelmointi kertaus

.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.