Miten WPF:llä on "järkevää", tai paremminkin, mikä on oikea tapa tehdä käyttöliittymä, jossa nappia painalla siirrytään toiselle sivulle siten, että toisen sivun sisältö aukee pääikkunan sisään?
Pääikkunassa siis saattaa olla joitain vakionappeja, jotka näkyvät aina huolimatta siitä millä sivulla milloinkin ollaan. Osa pääsivusta on omistettu eri sivujen sisällölle.
"Alasivut" eivät siis saa aueta omaan uuteen ikkunaan, vaan niiden sisältö pitää yksinkertaisesti pompahtaa esiin pääikkunan sisälle ilman mitään kehyksiä yms.
Winformeillahan tämä tehtiin (tai ainakin itse tein) asettamalla alasivujen toplevel = false, ja asettamalla niiden parentiksi joku pääsivun containeri, esim. panel- tjms. objekti.
Tällä hetkellä olen WPF:llä tehnyt homman niin, että luodaan alasivusta instanssi, irrotetaan alasivun sisältö ja siirretään se pääsivun objektiin (esim. grid). Homma periaatteessa toimii, mutta tulee ongelmia alasivun sulkemisessa ja uudelleen näyttämisessä. Voi olla että teen jotain väärinkin.
Pääasiallinen kysymys on kuitenkin se, että onko tämä ollenkaan oikea tapa WPF ympäristössä, vai onko olemassa jokin parempi keino? Tahtoo olla, että väkisin yrittää soveltaa jotain Winformeista opittuja menetelmiä tietämättä että uusi ympäristö tarjoaisi aivan toisenlaisen tavan toteuttaa sama asia.
Tässä vielä lyhyt esimerkki ideasta jota tällä hetkellä siis käytän:
Pääsivulla:
Public Sub Button1_Click() Dim Alaikkuna as new Window2 Alaikkuna.DetachContent() me.Grid1.Children.Add(Alaikkuna.Content) End Sub
Alasivulla:
Public Sub DetachContent() RemoveLogicalChild(Content) End Sub
Minusta tuntuu, ettei tuollaista käyttöliittymää ehkä pitäisi tehdä millään tekniikalla, mutta saatoin ymmärtää ihan väärin. Laitatko linkin vaikka vapaalla kädellä piirrettyyn leiskaan, josta selviää myös mitä sillä käyttöliittymällä käytetään, niin se auttaisi paljon.
MdiParentilla saat alaikkunat "pääformin" sisään. avaat ja suljet niitä toisia ikkunoita sitten miten haluat.
//aseta "pääformisi" properties:sta IsMdiContainer true. //sitten alaikkuna.mdiparent = this //C# esim. private void button1_Click(object sender, EventArgs e) { Form2 alaikkuna = new Form2(); alaikkuna.MdiParent = this; alaikkuna.Show(); }
ja vähän laajemmin. luo kolme formia, ja pari nappia.
esimerkissä formit Form1, Form2 ja Form3, sekä napit button1 ja button2
//C# esim. //pari muuttujaa bool Alasivu1Opened; bool Alasivu2Opened; //MdiContainerin load private void Form1_Load(object sender, EventArgs e) { this.IsMdiContainer = true; // asetetaan MdiContaineriksi Alasivu1Opened = false; Alasivu2Opened = false; } //nappi joka avaa alasivu1:sen private void button1_Click(object sender,EventArgs e) { if(Alasivu1Opened == false) { Form2 Alasivu1 = new Form2(); Alasivu1.MdiParent = this; Alasivu1.FormClosed += new FormClosedEventHandler(Alasivu1_FormClosed); Alasivu1.Show(); Alasivu1Opened = true; } } //nappi joka avaa Alasivu2:sen private void button2_Click(object sender,EventArgs e) { if(Alasivu2Opened == false) { Form3 Alasivu2 = new Form3(); Alasivu2.MdiParent = this; Alasivu2.FormClosed += new FormClosedEventHandler(Alasivu2_FormClosed); Alasivu2.Show(); Alasivu2Opened = true; } } //Alasivun suljettua muuttuja takaisin private void Alasivu1_FormClosed(object sender, FormClosedEventArgs e) { Alasivu1Opened = false; } // -"- private void Alasivu2_FormClosed(object sender, FormClosedEventArgs e) { Alasivu2Opened = false; }
**EDIT**
Hyvin mä vedän, kuinka mä voin edes lukea noin väärin kysymyksen :)
vastaanpa siis nyt.
TabControllilla saat luotua ihan hyvän (ellei jopa paremman) ympäristön.
MS ei MDI:tä liittänyt wpf:ään koska on jo varmaan win95:sta lähtien halunnut siitä eroon ;(
hk: kyseessä on auto-pc front endi, enkä nyt keksi mitään muutakaan järkevää tapaa tehdä toimivaa käyttöliittymää kuin tuo mainittu. Ehkä se oli huonosti selitetty.
Vanhan, ruman ja kankean Winform version kuvia ja ladattava versio löytyy täältä esimerkiksi siitä mitä haluan:
http://www.mp3car.com/vbulletin/other-cool-front-ends/125441-lil-front-end-alpha-0-3-a.html
groovyb, joo eli siis mdi hommat voi unohtaa :)
Täytyy tutustua tuohon tabcontrolliin. Toinen vaihtoehto, mitä monessa paikassa on ehdotettu tällaisessa yhteydessä, on tehdä eri sivuista UserControlleja ja avata näitä sitten pääsivun containeriin.
Edit: Ai joo siis perinteinen tabControl.. ei oikein sovellu siihen mitä haen takaa. Tsekkaa tuo vanha versio.
BTW. sain muropaketista hyvän linkin WPF kirjaan:
http://books.google.fi/books?id=xEDKq_QlZ18C&printsec=frontcover#v=onepage&q=&f=false
sniiki kirjoitti:
hk: kyseessä on auto-pc front endi, enkä nyt keksi mitään muutakaan järkevää tapaa tehdä toimivaa käyttöliittymää kuin tuo mainittu. Ehkä se oli huonosti selitetty.
Vanhan, ruman ja kankean Winform version kuvia ja ladattava versio löytyy täältä esimerkiksi siitä mitä haluan:
http://www.mp3car.com/vbulletin/other-cool-front-ends/125441-lil-front-end-alpha-0-3-a.html
Ok, tuollaiseen käyttöön toki on omiaan se, mitä olet tehnyt. Eikä ole mitenkään ruma, mitä noissa kuvissa näkyi, päinvastoin.
Noh, kauneus on katsojan silmissä :)
Jäänyt vähän tommoseksi sillisalaatiksi ja kokeiluversioksi tuo aiempi. Ympätty vaan lisää kokeiluja sekaan ja nyt kun päätin tehdä homman uusiksi siistimmin niin ajattelin toteuttaa sen WPF:llä. Etenkin sujuvamman grafiikan vuoksi ja koska tuon pitää pystyä venymään eri resoluutioihin ja kuvasuhteisiin, joka onnistuu WPF:llä paremmin.
On tuo vanha versio toki jokapäiväisessä käytössä ja ainakin itsellä ihan vakaa.
PS. Menee offtopiciksi, mutta WPF:n grafiikkapiirto ei vieläkään tuonut autuutta tuon scrollaavan listan suhteen (tästä on oma vanha threadi VB osiossa kun tuskailin asian kanssa Winformeilla). Eli kun hiirellä vetäisee listaa ja päästää sen pyörimään vapaasti, animointi on töksähtelevää, eikä mitään niin hienon sulavaa kuin esimerkiksi kökkö-cpu:lla varustetussa iPhonessa. Joku saattaa sanoa, että töksähtely johtuu taustalla tapahtuvasta tekstien hausta yms., mutta yhtä tökkivää scrollaus on vaikka tekisin yhden korkean panel objektin ja liikuttelisin sitä. Onko kukaan edelleenkään tehny vastaavaa, mitä tahansa pystysuunnassa tapahtuvaa, animointia joka olisi sulavaa?
Tässä joku varhainen testi taas selventämään mitä tarkoitan (älkää välittäkö taustan liikkuvasta gradientista ja skaalausongelmista ikkunaa venyttäessä):
http://sniiki.net/00/lista2.zip
Vaatii .Net Fm 3.5:n
Kyllä tuo kaiketi toimii ihan ok pitämällä ikkunat ikkunoinakin, eli en taida tehdä user controlleja noista sivuista.
Kopioin vaan alasivujen sisällön objektehin ja availen näitä objekteja pääikkunassa kun on tarpeen. Näin alasivuilla tehdyt asetukset ja muutokset pysyvät muistissa.
Esimerkki:
Class Window1 Dim sisalto2, sisalto3 As Object Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click Masteri.Children.Clear() Masteri.Children.Add(sisalto2) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button2.Click Masteri.Children.Clear() Masteri.Children.Add(sisalto3) End Sub Private Sub Window1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded 'Ikkuna2 Dim win2 As New Window2 sisalto2 = win2.Content win2.Content = Nothing win2.Close() 'Ikkuna3 Dim Win3 As New Window3 sisalto3 = Win3.Content Win3.Content = Nothing Win3.Close() End Sub End Class
Edit: UserControlleilla tottakai saavutetaan se etu että päästään käpistelemään sivun sisältöä "ulkoapäin", eikä pelkästään sivun omassa koodissa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.