[WPF] Juiste manier voor structuur GUI?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 12:55
Ik ben de laatste tijd redelijk bezig met WPF en heb er al veel over gelezen en geprobeerd, echter is er een onduidelijkheid waar ik niet echt een antwoord op heb kunnen vinden: hoe verzorg je de navigatie, zodat als je op een menuitem klikt, je een nieuw scherm krijgt waarop het menu blijft staan?

Ik heb eigenlijk twee opties geprobeerd:

- Telkens een nieuw window spawnen en de oude sluiten met close, maar dit werkt niet goed en vind ik maar een ranzige methode omdat je dan telkens een nieuw schermpje ziet opduiken. Dat is zeker niet de bedoeling van een applicatie.
- Een menu bovenaan in m'n Grid zetten in XAML, en daaronder nog iets van een Grid waarin ik dynamisch de content aanpas (met de Context property geloof ik). Dit is ook heel ranzig omdat ik dan via C# al m'n objecten erop moet plaatsen in plaats van via XAML. Tevens is het denk ik niet heel netjes om een Grid in een Grid te plaatsen?

Ik zoek dus een nette manier om een nieuwe pagina in te laden waarop het menu (aan de bovenkant) gewoon blijft staan.

Acties:
  • 0 Henk 'm!

Verwijderd

Ik zou eens kijken naar PRISM. Bevat design patterns en bijbehorende code. Het vereist wel een heel andere denkwijze dan code behind, maar dat is sowieso niet de manier om GUI applicaties te ontwikkelen tegenwoordig.

Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 12:55
Verwijderd schreef op dinsdag 15 februari 2011 @ 16:46:
Ik zou eens kijken naar PRISM. Bevat design patterns en bijbehorende code. Het vereist wel een heel andere denkwijze dan code behind, maar dat is sowieso niet de manier om GUI applicaties te ontwikkelen tegenwoordig.
Dat voorbeeld ziet er wel mooi uit. Maar wat bedoel je precies met je laatste zin? Dat de scheiding van presentatie en logica in de vorm van XAML + Code-Behind tegenwoordig niet meer gedaan wordt of...? :P

Acties:
  • 0 Henk 'm!

Verwijderd

Avalaxy schreef op dinsdag 15 februari 2011 @ 16:50:
[...]
Dat voorbeeld ziet er wel mooi uit. Maar wat bedoel je precies met je laatste zin? Dat de scheiding van presentatie en logica in de vorm van XAML + Code-Behind tegenwoordig niet meer gedaan wordt of...? :P
Probleem met WPF code behind is dat de view en de logic nog steeds 1 op 1 afhankelijk van elkaar zijn. Het idee achter MVVM (model-view-viewmodel) is om tussen je logic (model) en je view nog een viewmodel te plaatsen. Dit viewmodel slaat de brug tussen je model en alles wat daarachter zit (services, persistency, etc) naar de view. Resultaat is 0% code behind en 100% data binding van je view naar je viewmodel. De view is afhankelijk van de interface van je viewmodel, maar omgekeerd is het viewmodel niet afhankelijk van de view. Je kunt dus allerlei views voor je viewmodels maken, bijv. ook een WP7 applicatie.

PRISM is een guidance met design patterns en bijbehorende code en voorbeelden om MVVM goed te implementeren. Het vraagstuk over navigatie tussen windows en binnen een window zoals je noemde wordt ook heel net opgelost met o.a. regions en notification requests.

[ Voor 9% gewijzigd door Verwijderd op 15-02-2011 17:38 ]


Acties:
  • 0 Henk 'm!

  • mOrPhie
  • Registratie: September 2000
  • Laatst online: 12-09 11:35

mOrPhie

❤️❤️❤️❤️🤍

Ik zou de TS aanraden zich in te lezen in MVVM. Het is een presentation-pattern dat goed met WPF te combineren is. PRISM is een goede start, maar kent wel een leercurve die wat lastig is en neemt uiteindelijk het binden zelf niet uit handen. Je bent zelf nog steeds commands en properties aan het binden. Een leuk alternatief voor PRISM is Caliburn (http://caliburn.codeplex.com/). Ze hebben ook een hele simpele light versie (Caliburn Micro) die de essentie ontsluit en in 90% van de scenario's zal voldoen. Er is ergens op channel 9 een sessie te vinden met de naam "Build your own MVVM framework" oid. Daarin verteld de ontwikkelaar van Caliburn hoe hij tot Caliburn Micro is gekomen. Erg leerzaam.

Een experimentele community-site: https://technobabblenerdtalk.nl/. DM voor invite code.


Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 12:55
Hoi mOrPhie, ik ben me inderdaad aan het inlezen in MVVM en databinding. Ik heb ook al in Blend een databound WPF project aangemaakt om een beetje te kijken naar hoe zij dat doen. Tevens heb ik naar het simpele MVVM voorbeeld gekeken uit PRISM. Het principe van MVVM is me wel duidelijk (gewoon een soort MVC), de manier waarop een nieuwe pagina binnen het scherm wordt geladen ook (via een View), echter wat ik nogsteeds niet snap/heb kunnen vinden (heb nog niet alle voorbeelden van PRISM bekeken though) is hoe je boven elke view gewoon 1 menu kunt laten staan en aan de hand van die input een nieuw view in kunt laden. Het PRISM voorbeeld werkt bijvoorbeeld maar met 1 pagina waardoor ik niet kan afkijken hoe zij dit doen.

In Blend wordt op de volgende manier een view aangeroepen binnen een window:

XML:
1
2
3
<Grid x:Name="LayoutRoot" Background="White">
    <local:MainView />
</Grid>


Ik kan me voorstellen dat ik voor een menu die op elke pagina getoond wordt dus zoiets moet doen binnen m'n Grid:

XML:
1
2
3
4
5
6
7
8
<Grid x:Name="LayoutRoot" Background="White">
    <Menu>
        <MenuItem Header="File">
            <MenuItem Header="New" />
        </MenuItem>
    </Menu>
    <local:MainView />
</Grid>


Ik weet echter niet of dit juist is om in mijn MainWindow.xaml te zetten, of moet ik hier weer een aparte view oid voor maken...? En hoe verander ik dan weer die <local:MainView /> aan de hand van een event die aan een MenuItem hangt (nieuwe pagina dus)?

Ik zal in ieder geval nog wat meer in PRISM duiken en ook Caliburn eens bekijken. Dit is echter de hoofdvraag die nogsteeds speelt bij mij :)

Acties:
  • 0 Henk 'm!

Verwijderd

mOrPhie schreef op zaterdag 19 februari 2011 @ 00:19:
Ik zou de TS aanraden zich in te lezen in MVVM. Het is een presentation-pattern dat goed met WPF te combineren is. PRISM is een goede start, maar kent wel een leercurve die wat lastig is en neemt uiteindelijk het binden zelf niet uit handen. Je bent zelf nog steeds commands en properties aan het binden.
MVVM is voor mij essentieel voor WPF. PRISM is dus stap 2: gebruik het waar nodig. Het is een stijle leercurve, zeker als je het goed wilt doen met IoC en DI.
Een leuk alternatief voor PRISM is Caliburn (http://caliburn.codeplex.com/). Ze hebben ook een hele simpele light versie (Caliburn Micro) die de essentie ontsluit en in 90% van de scenario's zal voldoen. Er is ergens op channel 9 een sessie te vinden met de naam "Build your own MVVM framework" oid. Daarin verteld de ontwikkelaar van Caliburn hoe hij tot Caliburn Micro is gekomen. Erg leerzaam.
Goede tip. Keuze is altijd goed.
Avalaxy schreef op zaterdag 19 februari 2011 @ 00:57:
Ik weet echter niet of dit juist is om in mijn MainWindow.xaml te zetten, of moet ik hier weer een aparte view oid voor maken...? En hoe verander ik dan weer die <local:MainView /> aan de hand van een event die aan een MenuItem hangt (nieuwe pagina dus)?
In PRISM gaat dat met regions. Veel documentatie en voorbeelden over te vinden :)

Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 12:55
Ik ben even wat verder wezen stoeien met MVVM en dergelijken. Nu ben ik dus op het punt waar ik nieuwe views in wil laden in mijn Grid. PRISM doet dit met behulp van regions dus, echter heb je daar per sé PRISM voor nodig (oftewel: je moet die hele library inladen wil je dat kunnen gebruiken?).

Ik zoek eigenlijk een nette manier om het gewoon met WPF zelf te doen, zonder externe libraries te gebruiken :) Lijkt me toch niet dat zoiets standaards als het inladen van een nieuwe UserControl in een Grid oid. niet zou kunnen met een heel framework als WPF :?

Edit:

Ik heb met google gevonden dat het wel kan met een ContentPresenter. Mijn idee is om gewoon zoiets te doen:

XML:
1
2
3
4
5
6
7
<Grid x:Name="LayoutRoot">
    <ContentPresenter Name="ContentPresenter">
        <ContentPresenter.Content>
            <local:MainView />
        </ContentPresenter.Content>
    </ContentPresenter>
</Grid>


En dan de Content property te updaten met een event die ik aan m'n MenuItem koppel. Lijkt best een goed idee toch...?

[ Voor 28% gewijzigd door Avalaxy op 22-02-2011 23:29 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ja dat kan wel. Ik kan het nu niet zelf testen, maar Content binden aan een property in je viewmodel die een reference naar de view teruggeeft?

Probleem is dat je viewmodel dan wel een relatie heeft met views, maar dat kan je min of meer net oplossen met dependency injection.

Prism is juist een library die voorziet in standaard oplossingen voor deze veelvoorkomende functionaliteit. Maargoed zoals aangegeven, de drempel ligt hoog en de leercurve is stijl.

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 12:55
Verwijderd schreef op woensdag 23 februari 2011 @ 15:50:

Prism is juist een library die voorziet in standaard oplossingen voor deze veelvoorkomende functionaliteit. Maargoed zoals aangegeven, de drempel ligt hoog en de leercurve is stijl.
Mja, ik los het dan denk ik liever op door het zelf te programmeren. De manier die jij noemt heb ik inderdaad gelezen op StackOverflow, moet prima te doen zijn met DI.

Thanks voor de hulp, ik laat nog wel even weten of het is gelukt :)
Pagina: 1