2010-03-19 10 views
9

Ich brauche Hilfe mit Blick auf die Überlagerung der Prisma framework.Its ein wenig mehr komplexierte als die Verwendung von so lassen Sie mich explain.I könnte über denken dies auch: DWPF und Prism anzeigen Overlay

i-Shell haben (WPF-Fenster) und ich habe 2 Ansichten (A & B - beide Benutzersteuerungen) in einem Modul. Wenn die Shell geladen wird, lädt Ansicht A. Auf Ansicht A habe ich eine Schaltfläche zum "Popup" anzeigen B für einige Benutzereingaben. so würde ich natürlich an eine Art modales Fenster/Kontrolle denken, vielleicht sogar an ein Popup. Aber das Problem, das ich mit dem Popup konfrontiere, ist, dass wenn ich die Shell verschiebe, das Popup fixiert bleibt und es keine Ereignisse in Ansicht A blockiert. Ich habe versucht, Ansicht A zu deaktivieren, um Ereignisse abzubrechen, und ich habe auch versucht, ein zu verwenden Holen Sie sich die Ansicht B mit der Shell bewegen. Nur die Leinwand funktioniert, aber ich brauche jetzt eine Möglichkeit, sie zu blockieren. Kann ich eine Ansicht über einer anderen Ansicht mit Prisma überlagern? oder wie erstellt jeder andere modale Popups mit Prisma & wpf? Jede Beratung oder Hinweise würden sehr geschätzt werden.

Antwort

13

Wenn Sie eingebettete Dialoge ohne ein zusätzliches Fenster verwenden möchten, können Sie mit Prism's RegionManager das skizzierte Verhalten erreichen. Der Trick ist, die PopUp Region parallel zu Ihrem Hauptbereich im visuellen Baum zu setzen:

<Grid> 
    <ContentControl cal:RegionManager.RegionName="MainRegion" IsEnabled={Binding IsNoPopUpActive} /> 
    <ContentControl cal:RegionManager.RegionName="PopUpRegion"/> 
</Grid> 

nun die RegionManager verwenden Ansicht „A“ in die „MainRegion“ zu setzen. Erstellen Sie eine Controller-Klasse ähnlich IPopUpDialogController. Es sollte dafür verantwortlich sein, Ihre Ansicht "B" (oder jedes andere PopUpView in Ihrer Anwendung) auf Anforderung in die "PopUpRegion" zu stellen. Zusätzlich sollte es ein Flag steuern, das signalisiert, dass die darunter liegende "MainRegion" aktiviert oder deaktiviert wird. Auf diese Weise kann ein Benutzer nicht mit den Steuerelementen in der Ansicht "A" spielen, bis das Popup-Fenster geschlossen wird.

Dies kann sogar modal ausgeführt werden, indem Sie ComponentDispatcher.PushModal() verwenden, bevor Sie einen Frame auf den Dispatcher schieben. Ich würde jedoch empfehlen, modale Dialoge zu vermeiden.


aktualisieren: Wie in einem Kommentar gebeten, die IsNoPopUpActive in der Rückansicht Modell umgesetzt werden könnte. Dort konnte man es zu RegionManager anzeigen Sammlung für die Popup-Region verlinkt:

public bool IsNoPopUpActive 
{ 
    get { return _regionManager.Regions["PopUpRegion"].Views.Count() == 0; } 
} 

Denken Sie daran, sobald ein Property Ereignis auszulösen, wie Sie die Ansichten Sammlung ändern (hinzufügen/entfernen, um ein Pop-up).

Nur zu Ihrer Information: heutzutage vermeide ich es, die Steuerelemente im Hintergrund zu deaktivieren und stattdessen ein transparentes Panel einzufügen. Dies vermeidet das Klicken auf Hintergrundsteuerelemente. Dies geht jedoch nicht mit der Tastatureingabe (Registerkartensteuerung) um. Um die Tastatureingabe zu korrigieren, müssen Sie sicherstellen, dass der Tastaturfokus im Popup (MSDN on WPF Focus concepts) gefangen ist.

den folgenden Fokus Hinzufügen von Attributen zu dem Popup-Region sollte es tun:

KeyboardNavigation.DirectionalNavigation="None" 
KeyboardNavigation.ControlTabNavigation="None" 
KeyboardNavigation.TabNavigation="Cycle" 
KeyboardNavigation.TabIndex="-1" 
+0

Dank sehr viel! Ich habe es tatsächlich anders gemacht, aber sehr ähnlich zu deinem. Was ich tat, war ein Inhalts-Steuerelement für meine Shell-Region und erstellt einen Artikel Steuerelement Region in Modul A. Ich legte das Layout ein Gitter in der Artikel-Steuerelement Region zu verwenden und alles, was ich aktivierte und deaktivieren Ansichten innerhalb der Region "Popup". Ich werde Ihre Lösung versuchen. wird Feedback zu Ergebnissen geben. Danke noch einmal! – Zaheer

+0

Hallo Olli, kannst du das Snippet geben, wie man die "IsNoPopUpActive" -Eigenschaft einbaut? – ioWint

+0

Hi ioWint, ich habe die Antwort aktualisiert. –

2

Wenn Sie WPF + MVVM mit Prism verwenden Sie einen Blick auf diese Nachricht anzeigen Overlay-Controller erfolgen kann. Das Schöne an diesem Ansatz ist, dass Sie Komponententests für Ihr View-Modell mit einem Mock-Overlay-Controller schreiben können und dass der Mock-Controller das Ergebnis zurückgibt, das der Benutzer im Overlay auswählen würde.

Sie können es hier finden: http://presentationlayer.wordpress.com/2011/05/24/wpf-overlay-message-view-controller/

hoffe, das hilft