Windows Presentation Foundation (WPF)

Mikä on Windows Presentation Foundation ja miten se eroaa Windows Formsista? Tehdään yksinkertainen WPF-sovellus. Käydään läpi perusteet dependency propertieseista ja data bindingista.

Luentoesimerkki (luento10_wpf.zip)

Mikä on WPF?

Looginen ja visuaalinen puu

WPF-käyttöliittymä on rakennettu hierarkisesti. Elementit sijaitsevat hierarkisessa puussa sisäkkäin. Tätä puurakennetta kutsutaan loogiseksi puuksi. Visuaalinen puu on laajennettu looginen jossa kaikki elementin on palasteltu pienimpiin osiinsa.

esimerkki jossa visuaalinen puu, jonka sisällä loogisen puun elementin ovat korostettuina.

Trees in WPF

Data binding

Databindingin avulla voi automaattisesti päivittää käyttöliittymää lähdetietojen muuttuessa.

Tietoja voi sitoa yksi- tai kaksisuuntaisesti.

Tietoja voi sitoa vain DependencyProperty-tyyppisiin propertyihin.

Kaikilla käyttöliittymäkomponenteilla on DataContext-propery, jonka voi sitoa toiseen elementtiin tai tietolähteeseen. DataContext on periytyvä.

Binding-luokka

       <TextBox x:Name="TextBox1" Width="50" Height="20" />
            <TextBox x:Name="TextBox2" Width="50" Height="20" Text="{Binding Path=Text, Mode=TwoWay, ElementName=TextBox1}" />

Data Binding How-to Topics

Dependency properties

DependencyPropertyjen arvot selvitetään dynaamisesti eikä suoraan luokan privaatista attribuutista.

DependencyPropertyt tallennetaan DependencyObject-luokassa olevaan dictionary-tyyppiseen tietorakenteeseen. Avaimena toimii propertyn nimi.

Vain oletusarvoista poikkeavat arvot tallennetaan -> muistia säästyy.

Arvot periytyvät: Jos propertyn arvoa ei ole asetettu niin arvo haetaan loogisessa puussa ylemmältä tasolta.

<ListBox FontSize="20">
            <TextBox>Esimerkkitekstiä. Tämä Textbox perii fonttikoon Listboxilta.</TextBox>

            <TextBox FontSize="15">Lisää esimerkkitekstiä. Tämä Textbox ei peri fonttikokoa Listboxilta.</TextBox>
        </ListBox>

Dependency propertyissa on sisäänrakennettu muutosilmoitusmekanismi, joka mahdollistaa datasidonnan.

// nimeäminen tehtävä juuri seuraavalla tavalla
public static readonly DependencyProperty LaskuriProperty =
 DependencyProperty.Register(
   "Laskuri",
   typeof(int), // propertyn tietotyyppi
   typeof(Autolaskuri), // luokka jossa property sijaitsee
   new FrameworkPropertyMetadata(0,  // propertyn oletusarvo
        FrameworkPropertyMetadataOptions.AffectsRender, // vaikuttaa luokan ulkoasuun (textbox päivittyy)
        new PropertyChangedCallback(OnValueChanged),  // kutsutaan propertyn arvon muuttumisen jälkeen
        new CoerceValueCallback(MuutaLaskuria))); // kutsutaan ennen propertyn arvon muutosta

// seuraavat tehtävä juuri näin. Ei mitään tarkistuksien lisäämistä
public int Laskuri
{
   get { return (int)GetValue(LaskuriProperty); }
   set { SetValue(LaskuriProperty, value); }
}

// tätä kutsutaan ennen laskurin muuttamista ja voidaan tässä vaiheessa
// tehdä tarkistuksia ja muuttaa laskuriin asetettavaa arvoa
private static object MuutaLaskuria(DependencyObject element, object value)
{
   int luku = (int)value;
   if (luku < 0) value = 0;

   return luku;
}

// Laskuria on muutettu. Päivitetään tieto myös textboxiin
// parempi olisi bindata textbox tähän propertyyn:
// {Binding ElementName=IkkunanNimi, Path=Laskuri}
private static void OnValueChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
   Autolaskuri o = (Autolaskuri)obj;
   o.textBoxLaskuri.Text = (Convert.ToInt16(o.textBoxLaskuri.Text) + 1).ToString();
}

dependency propertyn erikoistapaus Attached DependencyProperty liittää propertyja muihin luokkiin.

DependencyPropertyn muutoksia voi seurata myös tapahtumien avulla. kts.malli (DependencyPropertyWatcher) ja lue sivu Getting change notifications from any dependency property in Windows Store Apps

Lisätietoa

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/luennot/luento10/
© Tommi Lahtonen (tommi.j.lahtonen@jyu.fi) <http://hazor.iki.fi/>
2016-10-04 12:24:04
Informaatioteknologia - Jyväskylän yliopiston informaatioteknologian tiedekunta