Attached Behaviours, Routed Events ja Drag & Drop - Viikkotehtävä 6

Tee valitsemasi taso WPF-ohjelmana. Tekemäsi ohjelma on toteutettava pyydettyjä menetelmiä käyttäen (routed events, attached behaviours ja drag & drop) Toteuta ohjelmasi mahdollisimman järkevästi ja helposti laajennettavalla tavalla.

Taso 1

Malliohjelma. Oman ohjelman ei tarvitse näyttää samalta vaan olennaista on oikealla tavalla toteutettu toiminta.

Ohjelmaikkuna on jaettuna kahteen osaan: yläosassa on tyhjä dockpanel ja alaosassa stackpanel jossa sijaitsee kymmenen label-kontrollia (tai labelista perittyä kontrollia) sisältäen näkyvät numerot 1-10.

Alaosassa olevat label-kontrollit voi raahata yläosan dockpaneliin jolloin ne asettuvat siististi vierekkäin. Ohjelma laskee summan dockpaneliin raahatuista numeroista. Summa näytetään dockpanelin vieressä ja päivitetään automaattisesti jokaisen raahauksen yhteydessä.

Toteuta ohjelma tavalla, joka toimii ilman ohjelmakoodin tai ohjelman asetusten muuttamista ja raahattavien labelien lukumäärästä tai sisältämistä numeroarvoista riippumatta. Ts. Ohjelman xamliin voi lisätä uusia labeleja raahattavaksi ja niiden tekstinä voi olla mikä tahansa kokonaisluku ja laskenta toimii ilman, että tarvitsee muuttaa ohjelmakoodia.

Katso DragDrop-mallia esimerkistä (DragDrop.zip).

Ohjelma ei saa kaatua vaikka yrittäisi raahata kontrolleja mihin suuntaan / paikkaan tahansa.

Taso 3

Malliohjelma. Ulkonäön ei tarvitse vastata mallia vaan tärkeintä on toiminnallisuus. Malli osaa myös muutamia asioita joita kolmostasossa ei vaadita. Mallissa on myös laskennassa välillä esiintyvä bugi, jota ei tarvitse matkia ;)

Toteuta peli jossa arvotaan lukualueelle (Canvas-kontrolli) n kappaletta kokonaislukuja ja n-1 laskuoperaatiota. Oletus on 3 kappaletta kokonaislukuja. Luvut ja operaatiot sijoitetaan alueelle satunnaisiin paikkoihin ja ne voivat mennä myös päällekkäin. Esim. arvotaan laskutoimitus 1+2-3=0 eli lukualueelle sijoitetaan luvut: 1,2 ja 3 ja operaatiot +,- ja = Ohjelman on huolehdittava, että arvotuilla luvuilla ja operaatioilla on myös olemassa järkevä ratkaisu.

C# ei sisällä Eval-funktiota. Helpointa on käyttää seuraavaa:

using System.Data;

DataTable dt = new DataTable();
var v = dt.Compute("1 + 2 - 3","");

Tarkoitus on raahata hiirellä luvut ja operaatiot ikkunan yläosassa olevaan tulosalueeseen (dockpanel) mahdollisimman nopeasti ja vähillä raahauksilla siten, että valmistuvan laskutoimituksen lopputulos on oikein. Raahattu luku tai operaatio sijoittuu aina laskutoimituksen viimeiseksi.

Jo raahattuja voi palauttaa takaisin lukualueelle valitsemalla menuista Edit|Undo, joka aina poistaa viimeisen raahatun laskutoimituksesta ja palauttaa sen lukualueelle.

Valmiissa laskuoperaatiossa on käytettävä kaikkia lukualueella tarjolla olevia objekteja. Ohjelma ilmoittaa valmiista ja onnistuneesta laskuoperaatiosta vaihtamalla tuloslaatikon pohjavärin vihreäksi ja näyttämällä tehtävään käytetyn ajan kohdelaatikon vieressä. Ohjelma näyttää koko ajan käytettyjen raahausten lukumäärän kohdelaatikon vieressä.

Label-kontrolli ilmoittaa omalla routedeventillä (esim. raahaus-niminen event) aina kun sitä yritetään raahata. Ohjelman pääikkuna kuuntelee tätä routedeventiä ja laskee sen perusteella omaan dependency propertyyn (esim. Laskuri) montako kertaa kontrolleja on pelissä raahattu.

File-valikosta voi New-valinnalla aloittaa ja arpoa uuden tehtävän.

Raahattavien kontrollien on oltava Label-kontrolleja. Labelin Drag on toteutettava attached propertyn avulla. Dropin käsittelynkin voi tehdä Attached Propertyna mutta kelpaa myös perinteisempi versio. Labelissa on käytettävä routedeventia.

Taso 5

Laajenna tason 3 ohjelmaa seuraavilla ominaisuuksilla:

Lukuja ja operaatioita voi vapaasti hiirellä raahata lukualueella paikasta toiseen.

Lukuja ja operaatioita voi myös raahata pois tuloslaatikosta takaisin lukualueelle. Tulosalueeseen (toteutus dockpanelilla) raahattu luku- tai operaatio sijoittuu laskussa siihen kohtaan (väliin) johon se raahataan.

Lukujen ja operaatioiden paikkaa/järjestystä voi vaihtaa raahaamalla suoraan myös tuloslaatikon sisällä kontrollia paikasta toiseen

Jos raahaus osuu jonkun laatikossa olevan objektin päälle niin raahattu objekti sijoitetaan aiemmin dockpanelissa ollutta objektia ennen.

Jätä arvonnan yhteydessä yksi satunnainen luku- tai operaatio tyhjäksi ja sijoita tässä tapauksessa labelin sisään textbox, johon käyttäjä voi itse syöttää haluamansa operaation tai luvun. Laajenna textboxin toimintaa lisäämällä siihen syötteen tarkistus attached propertyna. Textbox saa hyväksyä vain kokonaislukuja tai yksittäisen +,- tai = operaation.

Käyttäjien kommentit

Kommentoi Lisää kommentti
Kurssimateriaalien käyttäminen kaupallisiin tarkoituksiin tai opetusmateriaalina ilman lupaa on ehdottomasti kielletty!
http://appro.mit.jyu.fi/gko/vt/vt6/
© Tommi Lahtonen (tommi.j.lahtonen@jyu.fi) <http://hazor.iki.fi/>
2017-01-20 12:21:47
Informaatioteknologia - Jyväskylän yliopiston informaatioteknologian tiedekunta