Frage zu LaoutManagement in WPF

15/08/2009 - 12:40 von wpfRookie | Report spam
Hallo,

ich bin sicher nicht der Erste, der eine größere GUI in Forms aufteilt, die
einzeln aufgeblendet/abgeblendet werden sollen.

Um sowas mal zu verifizieren, habe ich mein Hauptfenster etwa so probiert:

<Window .>
<DockPanel>
<Ribbon DockPanel.Dock ="Top" .>

<StackPanel>
<me:Fenster2 x:Name="f2"></me:Fenster2>
<me:Fenster1 x:Name="f1"></me:Fenster1>
</StackPanel>

</DockPanel>
</Window>


Das Ribbon soll spàter mal die gesamten Commands bekommen, hier hat es nur
mal 2 Buttons, die im Codebehind entweder f1 oder f2 auf Visible schalten
und die jeweils andere auf Collapsed.

Was hier nicht funktioniert ist, dass die jeweilig sichtbare View den
gesamten verfügbaren Raum einnimmt. Mit dem Stackpanel im Hauptfenster
funktionierts natürlich noch (was man mit einem geeigneten Hintergrund
leicht verifizieren kann), nicht aber mit den UserControls.

Daraus ergibt sich die Frage: wie muss ich die UserControls (Fenster1,
Fenster2, , FensterN mit N>10 ) aufbauen, damit ich dort den gesamten
noch verfügbaren Platz ansprechen kann? Es gelingt mir z.B. nicht
grundsàtzlich, im UserControl den Hintergrund flàchendeckend zu haben.

Eine Alternative wàre, den Tree dynamisch zu haben und das XAML für das
jeweilig anzuzeigende Usercontrol reinzuhàngen (und vorher das Alte
auszuhàngen). Dies habe ich noch nicht evaluiert, da ich befürchte, dass es
Probleme in den ausgehàngten Teilbàumen mit Events und Updates via Binding
etc. gibt - Die Daten der einzelnen Forms sind eng miteinander verbunden.

Das "Composite Application Guidance Framework" habe ich mal überflogen,
passt nicht für meine App.

Ich hàtte auch kein Problem, ein Custom Panel zu machen und die zwei
Layout-Funktionen zu implementieren, um die verfügbare Größe hàndisch "von
oben" zu holen. Bevor ich das aber auch nur überlege, wollte ich mal hier
in der NG fragen, ob nicht jemand eine einfachere Lösung weiß.

Also - wie muss ichs machen? Vielen Dank im Vorraus!

LG - wpfRookie
 

Lesen sie die antworten

#1 Elmar Boye
16/08/2009 - 10:14 | Warnen spam
Hallo,

wpfRookie schrieb:
ich bin sicher nicht der Erste, der eine größere GUI in Forms aufteilt, die
einzeln aufgeblendet/abgeblendet werden sollen.

Um sowas mal zu verifizieren, habe ich mein Hauptfenster etwa so probiert:

<Window .>
<DockPanel>
<Ribbon DockPanel.Dock ="Top" .>

<StackPanel>
<me:Fenster2 x:Name="f2"></me:Fenster2>
<me:Fenster1 x:Name="f1"></me:Fenster1>
</StackPanel>

</DockPanel>
</Window>

Was hier nicht funktioniert ist, dass die jeweilig sichtbare View den
gesamten verfügbaren Raum einnimmt. Mit dem Stackpanel im Hauptfenster
funktionierts natürlich noch (was man mit einem geeigneten Hintergrund
leicht verifizieren kann), nicht aber mit den UserControls.



Beim Dockpanel würde LastChildFill="True" dafür sorgen,
dass das letzte Element den restlichen verfügbaren Platz einnimmt.
Eine Diskussion von vor einigen Tagen:
<URL:http://groups.google.de/group/micro...a008b9>

Daraus ergibt sich die Frage: wie muss ich die UserControls (Fenster1,
Fenster2, , FensterN mit N>10 ) aufbauen, damit ich dort den gesamten
noch verfügbaren Platz ansprechen kann? Es gelingt mir z.B. nicht
grundsàtzlich, im UserControl den Hintergrund flàchendeckend zu haben.



Wenn Du im Layout-Bereich unsicher bist solltest zunàchst mit den
Grundlagen nàher beschàftigen. Neben der Online Dokumentation
<URL:http://msdn.microsoft.com/de-de/lib...8.aspx>
wàre eine gute Adresse:
<URL:http://www.codeproject.com/KB/WPF/#...Layout>

Wenn die UserControls im wesentlichen eigenstàndig sind, wàre ein
gleichzeitiges laden eher kontraproduktiv, weil ressourcenintensiv.
Die sollte man dann schon dynamisch laden, z. B. via Application.LoadComponent

Die Daten der einzelnen Forms sind eng miteinander verbunden.



Eine Kopplung sollte nicht über die Steuerelemente direkt erfolgen,
sinnvoller ist im allgemeinen MVVM einzusetzen, das eine Trennung
vornimmt.
http://msdn.microsoft.com/de-de/mag...19663.aspx
"WPF-Anwendungen mit dem Model-View-ViewModel-Entwurfsmuster"

Mehr zu MVVM:
<URL:http://mvvmref.codeplex.com/>
<URL:http://karlshifflett.wordpress.com/mvvm/>

Das "Composite Application Guidance Framework" habe ich mal überflogen,
passt nicht für meine App.



Auch für Prism gibt es Nachhilfe:
<URL:http://www.codeproject.com/KB/WPF/P...r.aspx>

Wenn Du Prism gar nicht magst (kann ich teilweise nachvollziehen ;-),
gibt es andere Alternativen wie Caliburn
<URL:http://caliburn.codeplex.com/>

Geht es Dir nur darum eine Docking Lösung zu haben:
<URL:http://www.codeplex.com/AvalonDock/>

Gruß Elmar

Ähnliche fragen