Asetusten tallentaminen, tulostaminen - Pääteohjaus 8
Käydään läpi miten ohjelman asetuksia voi tallentaa rekisteriin (registry) ja .config-tiedostoihin. Tutustutaan myös tulostamiseen ja siihen liittyviin flowdocument- ja fixeddocument-luokkiin.
Registry
Tee luentomallin ja artikkelin Registry In's and Out's Using C# avulla seuraavat tehtävät:
- Luo uusi WPF-lomake. Lisää lomakkeelle muutama textbox joihin voit kirjoittaa nimesi ja sähköpostiosoitteesi.
- Lisää lomakkeelle painike joka tekee seuraavan: Luo rekisteriin HKEY_CURRENT_USER-tason alle uusi avain nimeltään: GKO. Lisää tälle avaimelle kaksi avainta joiden nimet ovat Name ja Email. Tallenna näihin avaimiin lomakkeelle syöttämäsi nimi ja sähköpostiosoite. Huomaa, että kirjoitustarve pitää tietää jo avainta avattaessa.
- Varmista, että painike toimii järkevästi vaikka edellämainitut avaimet olisivat jo olemassa (poikkeukset). Lisää siis Try-Catch-lohko kaiken varalta. Kaikkiin avaimiin ei aina ole luku- tai kirjoitusoikeutta jolloin aiheutuisi poikkeus.
- Lisää lomakkeelle painike, joka lukee edellämainitut tiedot rekisteristä ja päivittää ne lomakkeella oleviin kenttiin.
- Lisää vielä painike, joka poistaa edelläluodut avaimet rekisteristä. Ole varoinen, että et poista mitään muuta!
Settings
Katso luentovideosta ja mallikoodista miten käytetään settingsejä Visual Studiossa.
- Omia asetuksia pääset muokkaamaan kun etsit Solution Explorerista Properties-valinnan alta settings.settings-tiedoston.
- Tee vastaavat asetukset mitä rekisteritehtävän yhteydessä ja toteuta niiden avulla sama toiminnallisuus kuin rekisteritehtävässä. Tosin nyt et tarvitse poista-painiketta.
- Yritä sitoa (Binding) käyttöliittymässä olevat kontrollisi suoraan settingseissä oleviin tietoihin. Tee sidonnasta kaksisuuntainen. Huomaa, että et voi tehdä tätä helposti pelkästään XAMLin kautta vaan joudut määrittelemään kontrollin DataContextin ohjelmakoodissa. Jos haluat tehdä saman pelkästään XAMLin kautta niin tutustu sivuun WPF Binding My.Settings collection to Combobox items
- Kokeile mitä eroa on Application- ja User-asetuksilla. Tutki mitä tiedostoja ilmestyi
ohjelmasi kansioon sekä seuraaviin kansioihin:
C:\Documents and Settings\omatunnus\Application Data\University_Of_Jyväskylä C:\Documents and Settings\omatunnus\Local Settings\Application Data\University_Of_Jyväskylä
Tulostaminen
Kokeile miten yksinkertaista on tulostaa lomake tai jokin sen sisältämä kontrolli. Lisää lomakkeellesi painike ja siihen seuraava ohjelmakoodi:
PrintDialog dialog = new PrintDialog();
if (dialog.ShowDialog() == true)
{ dialog.PrintVisual(nimi, "Tulostusalue"); }
Korvaa nimi esim. koko ikkunalle tai gridille antamallasi nimellä. Kokeile miten painike toimii ja ohjaa tulostus PDF-tiedostoon.
FixedDocument
Lue artikkeli WPF Printing Part 2 – The Fixed Document. Saat artikkelista valmiin koodipohjan.
- Lisää lomakkeellesi painike, joka muodostaa ja tulostaa kolmesivuisen dokumentin. Jokaisella sivulla lukee sivun nro ja jotain lorem ipsumia.
- Varmista, että teksti tulostuu vain yhteen sarakkeeseen.
FlowDocument
Tutustu Microsoftin FlowDocument Overview -artikkeliin
- Lisää XAML-tiedostoosi FlowDocumentReader-elementti:
<FlowDocumentReader x:Name="docreader" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > - Lisää readerin sisään FlowDocument-elementti. Kirjoita FlowDocumentin sisään yksinkertainen dokumentti käyttäen edellämainitussa artikkelissa mainittuja ominaisuuksia. Voit käyttää pohjana mallitekstiä.
- Lisää painike jolla saat FlowDocumentin tulostettua käyttäen seuraavaa koodia:
private void button3_Click(object sender, RoutedEventArgs e) { PrintDialog dialog = new PrintDialog(); if (dialog.ShowDialog() != true) return; IDocumentPaginatorSource foo = docreader.Document; dialog.PrintDocument(foo.DocumentPaginator, "flow dokkari"); } - Kokeile painikkeen toimintaa. Kokeile miten FlowDocumentReaderin eri näyttötilat vaikuttavat tulostukseen.
- Korjaa tulostuskoodia seuraavilla riveillä:
// tarvitaan jotta ei tule sarakkeita docreader.Document.ColumnWidth = dialog.PrintableAreaWidth; docreader.Document.ColumnGap = 0; docreader.Document.PageWidth = dialog.PrintableAreaWidth; docreader.Document.PageHeight = dialog.PrintableAreaHeight; - Miten tulostus toimii nyt? Mitä tapahtuu FlowDocumentReaderille?
- Ongelma voidaan kiertää kloonaamalla FlowDocument tai palauttamalla näyttöön sopivat asetukset tulostuksen
jälkeen:
// edellisten jälkeen näytön ulkoasu vastaa tulostusta... ei hyvä // täytyy siis kloonata flowdocument // valitettavasti seuraava ei kloonaa BlockUIContainereita System.IO.MemoryStream s = new System.IO.MemoryStream(); TextRange source = new TextRange(docreader.Document.ContentStart, docreader.Document.ContentEnd); source.Save(s, DataFormats.Xaml); FlowDocument copy = new FlowDocument(); TextRange dest = new TextRange(copy.ContentStart, copy.ContentEnd); dest.Load(s, DataFormats.Xaml); // nyt tee copy-oliolle samat mitä aiemmin docreader.Document-oliolle... - Nyt tulostuksen pitäisi toimia kelvollisesti ja näytönkin pysyä sopivassa tilassa. Tosin kannattaa huomata, että FlowDocumentReaderia voi suoraan käyttää esikatseluna!

Käyttäjien kommentit