Attached Behaviours, Routed Events, Routed Commands ja Drag & Drop - Pääteohjaus 6
Tee seuraavat tehtävät luento 14 sisältämien esimerkkien avulla.
Malliratkaisu (ohjaus6_2012.zip
- Aloita uusi projekti ja valitse tyypiksi WPF Application
- Tee autolaskuri koostettuna komponenttina. Kokeile komponenttisi toimintaa.
-
Lisää laskuriin näytön poikki kulkeva auto, joka katoaa mentyään näytön ulkopuolelle. Auto ilmestyy sopivan
ajan kuluttua takaisin näytön toiselta laidalta. Riittää, että liikutat autoa tarpeeksi pitkälle näytön ulkopuolella ja siirrät sitten takaisin
näytölle. vinkki: DispatchTimer, Canvas (Sijoita auton kuva Canvakselle) ja ActualWidth.
Huomatkaa myös, että Canvaksen kuvaelementtiin liittämiä Attached Propertyja pitää muuttaa Canvas-luokan kautta eli tyyliin Canvas.SetLeft(auto, uusiarvo)
- Lisää autolaskuriisi oma menu ja laita myös menuun valinnaksi "Lisää auto". Toteuta menuvalintaan toiminnallisuus oman RoutedCommandin avulla.
Toteuta myös autolaskurin Lisää Auto -painike saman RoutedCommandin avulla.
Salli painikkeen ja menuvalinnan toiminta vain silloin, kun auto on näkyvissä eli auton ollessa piilossa ovat painike ja menuvalinta disabloituina.
Timerin tapahtumat eivät normaalisti aiheuta Routed Commandien tarkistuksia joten joudut lisäämään erillisen kutsun timerin suorittamaan metodiin: CommandManager.InvalidateRequerySuggested();
- Lisää autolaskuriisi RoutedEvent LaskuriChanged, jolla muut voivat seurata milloin laskurin arvo muuttuu:
// esitellään ja rekisteröidään event public static readonly RoutedEvent ValueChangedEvent = EventManager.RegisterRoutedEvent( "ValueChanged", // tapahtuman nimi RoutingStrategy.Bubble, // toimintatapa typeof(RoutedPropertyChangedEventHandler<int>), //eventissä liikuteltavan tiedon tietotyyppi int typeof(Autolaskuri)); // luokka johon event lisätään // pakolliset jotta luokkaan voidaan liittää käsittelijöitä tälle eventille public event RoutedPropertyChangedEventHandler<int> ValueChanged { add { AddHandler(ValueChangedEvent, value); } remove { RemoveHandler(ValueChangedEvent, value); } }
Aiheutetaan RoutedEvent:
RoutedPropertyChangedEventArgs<int> args = new RoutedPropertyChangedEventArgs<int>( vanha_arvo, uusiarvo, LaskuriChangedEvent); RaiseEvent(args);
- Kokeile miten RoutedEvent toimii. Lisää ikkunaan label, joka seuraaa autolaskurin arvon kasvua.
- Lisää ikkunaasi kolme autolaskuria esim. StackPanelin sisään. Lisää StackPaneliin käsittelijä, joka huomioi kaikkien Autolaskurien laskurin arvojen muuttumisen ja laskee laskurien yhteissumman johonkin labeliin. Huomannet, että tapahtuman mukana tulee tieto vanhasta ja uudesta arvosta...
- Lisää autolaskuriin tuki Drag & Dropille. Autolaskuri hyväksyy tekstimuotoista dataa. Jos Autolaskuri saa siihen raahatusta
tekstidatasta parsittua kelvollisen kokonaisluvun niin tämä kokonaisluku lisätään laskurin arvoon.
string stringData = "Some string data to store..."; string dataFormat = DataFormats.Text; DataObject dataObject = new DataObject(dataFormat, stringData);
- Tee jostakin labelista raahattava ja käytä raahattavana datana labelin sisältämää tekstiä (numeroa) ja kokeile raahata se autolaskurin päälle. Jos kaikki meni oikein niin laskurin arvo kasvaa labelin sisältämän luvun verran.
Käyttäjien kommentit