This weekend I've been having one heck of a time getting WPF Ribbon v4 working with MVVM and Prism (using unity). After much trial and error, I believe I have it working. I was hoping someone could take a look at it and give me some feedback.
RibbonRegionAdapter.cs
public class RibbonRegionAdapter : RegionAdapterBase<Ribbon>
{
private Ribbon _ribbonTarget;
public RibbonRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory)
: base(regionBehaviorFactory)
{
}
protected override void Adapt(IRegion region, Ribbon regionTarget)
{
_ribbonTarget = regionTarget;
region.Views.CollectionChanged += delegate {
foreach (RibbonTab tab in region.Views.Cast<RibbonTab>())
{
if (!_ribbonTarget.Items.Contains(tab))
{
_ribbonTarget.Items.Add(tab);
}
}
};
}
protected override IRegion CreateRegion()
{
return new SingleActiveRegion();
}
}
BootStrapper.cs - To register our regionAdapter
protected override RegionAdapterMappings ConfigureRegionAdapterMappings()
{
RegionAdapterMappings mappings = base.ConfigureRegionAdapterMappings();
if (mappings != null)
{
mappings.RegisterMapping(typeof(Ribbon), this.Container.Resolve<RibbonRegionAdapter>());
}
return mappings;
}
CarRibbonTab.xaml
<ribbon:RibbonTab x:Class="CarManager.Modules.CarModule.Views.CarRibbonTab"
xmlns:ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
Header="Officers">
<ribbon:RibbonGroup Header="New">
</ribbon:RibbonGroup>
<ribbon:RibbonGroup Header="Manage">
<ribbon:RibbonButton Label="Make"
LargeImageSource="..\Resources\make.png" />
<ribbon:RibbonButton Label="Inventory"
LargeImageSource="..\Resources\Inventory.png" />
<ribbon:RibbonButton Label="Assignments" />
</ribbon:RibbonGroup>
</ribbon:RibbonTab>
CarRibbonTab.cs - Code behind for the View
public partial class CarRibbonTab: RibbonTab
{
public CarRibbonTab()
{
InitializeComponent();
}
}
Shell.xaml - Just showing the ribbon control
<ribbon:Ribbon DockPanel.Dock="Top" Title="CarManager" prism:RegionManager.RegionName="RibbonRegion">
<ribbon:Ribbon.ApplicationMenu>
<ribbon:RibbonApplicationMenu SmallImageSource="Images\Icon.png">
<ribbon:RibbonApplicationMenuItem Header="Exit"
ImageSource="Images\ExitIcon.png"/>
</ribbon:RibbonApplicationMenu>
</ribbon:Ribbon.ApplicationMenu>
</ribbon:Ribbon>
CarModule.cs - registering the view with the region
public class CarModule: IModule
{
private readonly IRegionManager _regionManager;
private readonly IUnityContainer _container;
public MenuItemViewModel MenuItem;
public CarModule(IUnityContainer container, IRegionManager regionManager)
{
_container = container;
_regionManager = regionManager;
}
public void Initialize()
{
//Ribbon
_container.RegisterType<Object, CarRibbonTab>("CarRibbonTab");
_regionManager.AddToRegion("RibbonRegion", _container.Resolve<CarRibbonTab>());
}
}