Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: WPF + moni-ikkunaisen käyttöliittymän periaate?

sniiki [11.08.2009 14:05:47]

#

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

hk [12.08.2009 21:11:29]

#

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.

groovyb [12.08.2009 22:28:51]

#

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 ;(

sniiki [13.08.2009 09:45:07]

#

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

hk [13.08.2009 22:36:40]

#

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.

sniiki [14.08.2009 08:04:55]

#

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

sniiki [18.08.2009 11:07:21]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta