SlideShare une entreprise Scribd logo
1  sur  54
.NET ohjelmointi
             A-ITY04-2000

               kertaus

            Timo Tanila
Tampere University of Applied Sciences
.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ä.
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
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ä
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.
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,
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.
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.
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.
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ä.
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ä.
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)
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
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.
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.
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.
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.
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.
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
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
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
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
’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
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
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
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)
’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).
’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.
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.
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.
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 ?.
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.
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.
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
Brushes ja Transform

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


• Transform-luokkien avulla voidaan muokata
  muotoelementtejä.
WPF spesifinen osuus
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.
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ä.
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.
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.
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.
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ä
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.
ASP.NET spesifinen osuus
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.
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();
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
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ä
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
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.
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.
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)
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.)
.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.

Contenu connexe

Similaire à Net ohjelmointi kertaus

Windows 8
Windows 8Windows 8
Windows 8Sovelto
 
TechDays2011 Web-kokoukset Lyncillä Tieturi/Kuosmanen & Huhtala
TechDays2011 Web-kokoukset Lyncillä Tieturi/Kuosmanen & HuhtalaTechDays2011 Web-kokoukset Lyncillä Tieturi/Kuosmanen & Huhtala
TechDays2011 Web-kokoukset Lyncillä Tieturi/Kuosmanen & HuhtalaTieturi Oy
 
Mac läppäri tutuksi (Oskari Niitamo, Espoon Työväenopisto)
Mac läppäri tutuksi (Oskari Niitamo, Espoon Työväenopisto) Mac läppäri tutuksi (Oskari Niitamo, Espoon Työväenopisto)
Mac läppäri tutuksi (Oskari Niitamo, Espoon Työväenopisto) Oskari Niitamo
 
Datajalostamo-seminaari 5.6.2014: Sovelluskehittäjät ja data – kehittäjäyhtei...
Datajalostamo-seminaari 5.6.2014: Sovelluskehittäjät ja data – kehittäjäyhtei...Datajalostamo-seminaari 5.6.2014: Sovelluskehittäjät ja data – kehittäjäyhtei...
Datajalostamo-seminaari 5.6.2014: Sovelluskehittäjät ja data – kehittäjäyhtei...Digitalmikkeli
 
03 - Johdanto EAI 2 (BD2226 Tietojärjestelmien integrointi)
03 - Johdanto EAI 2 (BD2226 Tietojärjestelmien integrointi)03 - Johdanto EAI 2 (BD2226 Tietojärjestelmien integrointi)
03 - Johdanto EAI 2 (BD2226 Tietojärjestelmien integrointi)Jarmo Talvivaara
 
Windows Store Apps - näin tehtiin Sovelto Hub
Windows Store Apps - näin tehtiin Sovelto Hub  Windows Store Apps - näin tehtiin Sovelto Hub
Windows Store Apps - näin tehtiin Sovelto Hub Sovelto
 
Yrittäjän ilmaisohjelmat
Yrittäjän ilmaisohjelmatYrittäjän ilmaisohjelmat
Yrittäjän ilmaisohjelmatTimo Kumpulainen
 
Extranet-järjestelmät Suomessa
Extranet-järjestelmät SuomessaExtranet-järjestelmät Suomessa
Extranet-järjestelmät SuomessaPerttu Tolvanen
 
Web-sisällönhallinta ja mukautuva esitystapa
Web-sisällönhallinta ja mukautuva esitystapaWeb-sisällönhallinta ja mukautuva esitystapa
Web-sisällönhallinta ja mukautuva esitystapaLoihde Advisory
 
ITK2019: Oppilaat ohjelmoivat monialaisen oppimiskokonaisuuden web-sovelluks...
ITK2019: Oppilaat ohjelmoivat monialaisenoppimiskokonaisuuden web-sovelluks...ITK2019: Oppilaat ohjelmoivat monialaisenoppimiskokonaisuuden web-sovelluks...
ITK2019: Oppilaat ohjelmoivat monialaisen oppimiskokonaisuuden web-sovelluks...Ville Ilkkala
 
Johdatus oliopohjaiseen ajatteluun
Johdatus oliopohjaiseen ajatteluunJohdatus oliopohjaiseen ajatteluun
Johdatus oliopohjaiseen ajatteluunPasi Kellokoski
 
Windows 7 Käyttöönottoprojekti
Windows 7 KäyttöönottoprojektiWindows 7 Käyttöönottoprojekti
Windows 7 KäyttöönottoprojektiVaihde 7
 
Vincit Teatime 2015 - Heikki Salo: Case ZenRobotics: JavaScriptin äärirajoilla
Vincit Teatime 2015 - Heikki Salo: Case ZenRobotics: JavaScriptin äärirajoillaVincit Teatime 2015 - Heikki Salo: Case ZenRobotics: JavaScriptin äärirajoilla
Vincit Teatime 2015 - Heikki Salo: Case ZenRobotics: JavaScriptin äärirajoillaVincitOy
 
Web-sivustot
Web-sivustotWeb-sivustot
Web-sivustotjarfroy
 
Johdatus ohjelmointiin
Johdatus ohjelmointiinJohdatus ohjelmointiin
Johdatus ohjelmointiinJukkaWallenius
 
Mac-työasemat ylläpidon kiusana
Mac-työasemat ylläpidon kiusanaMac-työasemat ylläpidon kiusana
Mac-työasemat ylläpidon kiusanaSovelto
 
Xml työelämässä 2015
Xml työelämässä 2015Xml työelämässä 2015
Xml työelämässä 2015JoniKettunen
 

Similaire à Net ohjelmointi kertaus (20)

Windows 8
Windows 8Windows 8
Windows 8
 
Tekstitys
TekstitysTekstitys
Tekstitys
 
Xml työelamässa
Xml työelamässaXml työelamässa
Xml työelamässa
 
TechDays2011 Web-kokoukset Lyncillä Tieturi/Kuosmanen & Huhtala
TechDays2011 Web-kokoukset Lyncillä Tieturi/Kuosmanen & HuhtalaTechDays2011 Web-kokoukset Lyncillä Tieturi/Kuosmanen & Huhtala
TechDays2011 Web-kokoukset Lyncillä Tieturi/Kuosmanen & Huhtala
 
Mac läppäri tutuksi (Oskari Niitamo, Espoon Työväenopisto)
Mac läppäri tutuksi (Oskari Niitamo, Espoon Työväenopisto) Mac läppäri tutuksi (Oskari Niitamo, Espoon Työväenopisto)
Mac läppäri tutuksi (Oskari Niitamo, Espoon Työväenopisto)
 
Ser web
Ser webSer web
Ser web
 
Datajalostamo-seminaari 5.6.2014: Sovelluskehittäjät ja data – kehittäjäyhtei...
Datajalostamo-seminaari 5.6.2014: Sovelluskehittäjät ja data – kehittäjäyhtei...Datajalostamo-seminaari 5.6.2014: Sovelluskehittäjät ja data – kehittäjäyhtei...
Datajalostamo-seminaari 5.6.2014: Sovelluskehittäjät ja data – kehittäjäyhtei...
 
03 - Johdanto EAI 2 (BD2226 Tietojärjestelmien integrointi)
03 - Johdanto EAI 2 (BD2226 Tietojärjestelmien integrointi)03 - Johdanto EAI 2 (BD2226 Tietojärjestelmien integrointi)
03 - Johdanto EAI 2 (BD2226 Tietojärjestelmien integrointi)
 
Windows Store Apps - näin tehtiin Sovelto Hub
Windows Store Apps - näin tehtiin Sovelto Hub  Windows Store Apps - näin tehtiin Sovelto Hub
Windows Store Apps - näin tehtiin Sovelto Hub
 
Yrittäjän ilmaisohjelmat
Yrittäjän ilmaisohjelmatYrittäjän ilmaisohjelmat
Yrittäjän ilmaisohjelmat
 
Extranet-järjestelmät Suomessa
Extranet-järjestelmät SuomessaExtranet-järjestelmät Suomessa
Extranet-järjestelmät Suomessa
 
Web-sisällönhallinta ja mukautuva esitystapa
Web-sisällönhallinta ja mukautuva esitystapaWeb-sisällönhallinta ja mukautuva esitystapa
Web-sisällönhallinta ja mukautuva esitystapa
 
ITK2019: Oppilaat ohjelmoivat monialaisen oppimiskokonaisuuden web-sovelluks...
ITK2019: Oppilaat ohjelmoivat monialaisenoppimiskokonaisuuden web-sovelluks...ITK2019: Oppilaat ohjelmoivat monialaisenoppimiskokonaisuuden web-sovelluks...
ITK2019: Oppilaat ohjelmoivat monialaisen oppimiskokonaisuuden web-sovelluks...
 
Johdatus oliopohjaiseen ajatteluun
Johdatus oliopohjaiseen ajatteluunJohdatus oliopohjaiseen ajatteluun
Johdatus oliopohjaiseen ajatteluun
 
Windows 7 Käyttöönottoprojekti
Windows 7 KäyttöönottoprojektiWindows 7 Käyttöönottoprojekti
Windows 7 Käyttöönottoprojekti
 
Vincit Teatime 2015 - Heikki Salo: Case ZenRobotics: JavaScriptin äärirajoilla
Vincit Teatime 2015 - Heikki Salo: Case ZenRobotics: JavaScriptin äärirajoillaVincit Teatime 2015 - Heikki Salo: Case ZenRobotics: JavaScriptin äärirajoilla
Vincit Teatime 2015 - Heikki Salo: Case ZenRobotics: JavaScriptin äärirajoilla
 
Web-sivustot
Web-sivustotWeb-sivustot
Web-sivustot
 
Johdatus ohjelmointiin
Johdatus ohjelmointiinJohdatus ohjelmointiin
Johdatus ohjelmointiin
 
Mac-työasemat ylläpidon kiusana
Mac-työasemat ylläpidon kiusanaMac-työasemat ylläpidon kiusana
Mac-työasemat ylläpidon kiusana
 
Xml työelämässä 2015
Xml työelämässä 2015Xml työelämässä 2015
Xml työelämässä 2015
 

Net ohjelmointi kertaus

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