Wer wie ich mit Prism arbeitet, dabei aber nicht auf Ribbon verzichten möchte, nutzt einfach den Ribbon Region Adapter. Sowohl „WPF PRISM 4.0 and Ribbons“ als auch der Artikel „Creating View-Switching Applications with Prism 4“ auf codeproject.com bieten Informationen dazu. Problematisch wird es nur, wenn wie in meinem Fall auf VB.Net statt auf C# gesetzt wird. Um dennoch mit Ribbon arbeiten zu können, habe ich den RibbonRegionAdapter in VB.Net umgesetzt. Die wichtigsten Ausschnitte der Klasse sind im Folgenden erläutert.
Imports System.Windows
Imports System.Collections.Specialized
Imports Microsoft.Practices.Prism.Regions
Imports Microsoft.Windows.Controls.Ribbon
Public Class RibbonRegionAdapter
Inherits RegionAdapterBase(Of Ribbon)
Public Sub New(behaviorFactory As IRegionBehaviorFactory)
MyBase.New(behaviorFactory)
End Sub
Wie im Listing zu erkennen, wird Microsoft.Practices.Prism.Regions und Microsoft.Windows.Controls.Ribbon importiert. Die Klasse RibbonRegionAdapter erbt dabei von RegionAdapterBase aus Prism.Regions. Im Konstruktor von RibbonRegionAdapter wird der Konstruktor der Basisklasse aufgerufen, wobei die IRegionBehaviorFactory übergeben wird.
Protected Overrides Function CreateRegion() As Microsoft.Practices.Prism.Regions.IRegion
Return New SingleActiveRegion
End Function
Die Funktion CreateRegion() kann nahezu identisch übernommen werden. Es müssen lediglich die VB.Net spezifischen Anpassungen vorgenommen werden.
Protected Overrides Sub Adapt(region As Microsoft.Practices.Prism.Regions.IRegion,
regionTarget As Microsoft.Windows.Controls.Ribbon.Ribbon)
AddHandler region.Views.CollectionChanged, Sub(sender, e)
Select Case e.Action
Case NotifyCollectionChangedAction.Add
For Each element As FrameworkElement In e.NewItems
regionTarget.Items.Add(element)
Next
Case NotifyCollectionChangedAction.Remove
For Each elementLoopVariable As UIElement In e.OldItems
Dim element = elementLoopVariable
If regionTarget.Items.Contains(element) Then
regionTarget.Items.Remove(element)
End If
Next
End Select
End Sub
End Sub
In der Methode Adapt() werden zwei Fälle unterschieden. Sollen neue Elemente hinzugefügt werden, wird für jedes neue Element die Methode Add() der Zielregion aufgerufen und das neue Element damit hinzugefügt. Sollen Elemente entfernt werden, so wird geprüft, ob sich das Element in der Zielregion befindet. Ist dies der Fall, wird es mit der Methode Remove() entfernt. Die Funktionalität unterscheidet sich nicht von der Version in C#. Es ist lediglich ein anderer Aufbau.
Ich hoffe so ein paar Leuten, die auf VB.Net angewiesen sind, helfen zu können. In einem der nächsten Artikel werde ich vermutlich auf die geheimnisvolle Variable KeepAlive von IRegionMemberLifetime eingehen.