OutlookBar
The OutlookBar is implemented in the MainWindow
and is data-bound to an OutlookBarViewModel
, which is injected into the MainWindowViewModel
.
Here is a diagram of the OutlookBarViewModel
:
The OutlookBarViewModel
has a collection of OutlookBarItem
elements, allowing you to add items to this collection.
Each OutlookBarItem
has a property called ItemControl
, which represents the UserControl
that will be displayed within the item.
To add a simple OutlookBarItem
, you can do this in the MainWindowViewModel
:
outlookBarViewModel.OutlookBarItems.Add(new OutlookBarItem()
{
Header = "MyFirstBarItem",
ItemControl = new MyOutLookBarView()
});
MyOutLookBarView
is a basic UserControl
with a TextBlock
, which looks like this:
However, this approach is not very MVVM-friendly. To improve it, you can use the OutlookBarService
.
OutlookBar Service
In a module, you can override the ConfigureOutlookBarService
method as follows:
protected override void ConfigureOutlookBarService(IOutlookBarService outlookBarService)
{
outlookBarService
.AddOutlookBarItem(new OutlookBarItem() { Header = "MyFirstBarItem" })
.WithView<MyOutLookBarView>();
}
Now, the view is activated by the IServiceProvider
.
In most cases, your OutlookBar will display either a list of menus or a TreeView with menus.
WithSimpleMenuView
To simplify this process, extensions and builders are available.
To create a simple list of menus, use this code:
protected override void ConfigureOutlookBarService(IOutlookBarService outlookBarService)
{
outlookBarService
.AddOutlookBarItem(new OutlookBarItem() { Header = "MyFirstBarItem" })
.WithSimpleMenuView()
.AddMenuItem(new MenuItemViewModel() { Title = "EmptyMenu 1", ImageSource = ImageProvider.GetImage(Innova.Prism.Library.Styles.WindowsMenuImages.gear_Keyname)?.Source })
.AddMenuItem(new MenuItemViewModel() { Title = "EmptyMenu 2" })
.AddMenuItem(new MenuItemViewModel() { Title = "EmptyMenu 3" });
}
This code results in the following menu:
You can also turn both OutlookBarItem
and MenuItem
into classes activated by the IServiceProvider
.
Here are the OutlookBarItem
and Menu3
classes. This allows you to inject dependencies, such as the IEventAggregator
, into the constructor of Menu3
:
public class MyFirstBarItem : OutlookBarItem
{
public MyFirstBarItem()
{
Header = "MyFirstBarItem";
SortOrder = 1;
Icon = ImageProvider.GetImage(Innova.Prism.Library.Styles.WindowsMenuImages.gear_Keyname)?.Source;
}
}
public class EmptyMenu3 : MenuItemViewModel
{
private readonly IEventAggregator _eventAggregator;
public EmptyMenu3(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
Title = "EmptyMenu 3";
}
protected override void ExecuteCommand()
{
_eventAggregator.PublishListShowEvent<Data.Entity.Categories>();
}
}
To use these classes, configure them like this:
protected override void ConfigureOutlookBarService(IOutlookBarService outlookBarService)
{
outlookBarService
.AddOutlookBarItem<MyFirstBarItem>()
.WithSimpleMenuView()
.AddMenuItem(new MenuItemViewModel() { Title = "EmptyMenu 1", ImageSource = ImageProvider.GetImage(Innova.Prism.Library.Styles.WindowsMenuImages.gear_Keyname)?.Source })
.AddMenuItem(new MenuItemViewModel() { Title = "EmptyMenu 2" })
.AddMenuItem<EmptyMenu3>();
}
Now, when you click Menu3
, the list of Categories is displayed:
In most cases, you want to show a list when a menu is clicked. There are extensions for this purpose:
protected override void ConfigureOutlookBarService(IOutlookBarService outlookBarService)
{
outlookBarService
.AddOutlookBarItem<MyFirstBarItem>()
.WithSimpleMenuView()
.AddMenuWithShowList<Data.Entity.Customers>()
.AddMenuWithShowList<Data.Entity.Orders>()
.AddMenuWithShowList<Data.Entity.Categories>();
}
The result looks like this:
You can also present it as a TreeView
to create a hierarchy of menu items.
WithTreeMenuView
To create a hierarchical menu, use the following code:
protected override void ConfigureOutlookBarService(IOutlookBarService outlookBarService)
{
outlookBarService
.AddOutlookBarItem<MyFirstBarItem>()
.WithTreeMenuView()
.AddMenuItem(new MenuItemViewModel() { Title = "Heading" },
subbuilder => subbuilder
.AddMenuWithShowList<Data.Entity.Customers>()
.AddMenuWithShowList<Data.Entity.Orders>()
.AddMenuWithShowList<Data.Entity.Categories>());
}
The resulting menu looks like this:
In this example, we changed WithSimpleMenuView
to WithTreeMenuView
, added an empty MenuItem
, and then added three sub-menu items under that heading.