The best way would be first to use a grid control to lay out the controls (as Blam suggested) like so:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- Menu control. (Whichever you see fit. The menu could be established
within this control, or you could use a custom UserControl depending
on your needs.) -->
<StackPanel />
<!-- Content control -->
<ContentPresenter Name="ContentHolder"
Grid.Column="1" />
</Grid>
Depending on your design pattern, there are a couple of ways to get your content to appear as desired.
If you are using MVVM, the ContentPresenter control could be bound to a ViewModel in the data context of your main window, like so:
<ContentPresenter Name="ContentHolder"
Grid.Column="1"
Content="{Binding ContentData}" />
And a corresponding property would exist in your ViewModel, such as:
public ViewModelBase ContentData{
get { return _contentData; }
}
If that's a lot of Greek to you, you are probably not using MVVM as your design pattern. In that case, the code behind of your main window class could handle setting the content of the ContentPresenter with an event handler.
The gist of your event handler could be something like this:
public void HandleNavigationChange(SwitchCondition sc){
UserControl newContent = null;
switch (sc) {
case SwitchCondition.NavigationItem1:
newContent = new NavigationItem1();
break;
case SwitchCondition.NavigationItem1:
newContent = new NavigationItem1();
break;
//ETC
}
ContentHolder.Content = newContent;
}
You could then call this method from menu item clicks, or if you like, from children controls.