Вы получаете странное поведение, потому что у вас есть MenuItem в MenuItem.Установив ItemTemplate в меню, вы устанавливаете HeaderTemplate для каждого MenuItem.MenuItem будет отображать свой обычный шаблон, и там, где обычно размещается текст заголовка, у него будет целый другой MenuItem.Я думаю, что пространство, которое вы видите, является пространством, зарезервированным для InputGestureText во внешнем MenuItem.
Вместо этого вы хотите установить ItemContainerStyle.Это позволит вам установить свойства для элементов меню, созданных меню.Есть один трюк, который вы должны использовать, чтобы вы могли создать отдельный объект Image для каждого MenuItem.По умолчанию объекты, включенные в стиль, будут общими, и вы получите один объект Image, общий для каждого MenuIte, но если вы поместите их в отдельный словарь ресурсов, вы можете пометить их как не общие.См. эту проблему для Connect и связанный обходной путь .
Примерно так:
<Style x:Key="SideBarStyle" TargetType="{x:Type Menu}">
<Setter Property="ItemsPanel" Value="{StaticResource SideBarItemsPanelTemplate}"/>
<Setter Property="Background" Value="White"/>
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="MenuItem">
<Style.Resources>
<ResourceDictionary Source="Icon.xaml"/>
</Style.Resources>
<Setter Property="Command" Value="{Binding}"/>
<Setter Property="Header" Value="{Binding Text}"/>
<Setter Property="Background" Value="AliceBlue"/>
<Setter Property="Icon" Value="{StaticResource Icon}"/>
</Style>
</Setter.Value>
</Setter>
</Style>
Где Icon.xaml содержит:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Image x:Key="Icon" x:Shared="False" Width="16" Height="16" Source="{Binding Image}"/>
</ResourceDictionary>