Я использую шаблон заголовочного меню, а также шаблон подменю-заголовка. Главное меню заголовка Работает нормально, но подменю не работает. Не показывает.
Мой код Wpf XAML (шаблон заголовка подменю):
<ControlTemplate x:Key = "{x:Static MenuItem.SubmenuHeaderTemplateKey}" TargetType = "{x:Type MenuItem}">
<Border x:Name = "Border" BorderThickness = "1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width = "Auto" SharedSizeGroup = "Icon" />
<ColumnDefinition Width = "*" />
<ColumnDefinition Width = "Auto" SharedSizeGroup = "Shortcut" />
<ColumnDefinition Width = "13" />
</Grid.ColumnDefinitions>
<ContentPresenter x:Name = "Icon" Margin = "6,0,6,0" VerticalAlignment = "Center" ContentSource = "Icon" />
<ContentPresenter x:Name = "HeaderHost" Grid.Column = "1" ContentSource = "Header" RecognizesAccessKey = "True" />
<TextBlock x:Name = "InputGestureText" Grid.Column = "2" Text = "{TemplateBinding InputGestureText}" Margin = "5,2,2,2" DockPanel.Dock = "Right" />
<Path Grid.Column = "3" HorizontalAlignment = "Center" VerticalAlignment = "Center" Data = "M 0 0 L 0 7 L 4 3.5 Z">
<Path.Fill>
<SolidColorBrush Color = "White" />
</Path.Fill>
</Path>
<Popup x:Name = "Popup" Placement = "Right" HorizontalOffset = "-4" IsOpen = "{TemplateBinding IsSubmenuOpen}" AllowsTransparency = "True" Focusable = "False" PopupAnimation = "Fade">
<Border x:Name = "SubmenuBorder" SnapsToDevicePixels = "True" Background = "RoyalBlue" BorderThickness = "1">
<Border.BorderBrush>
<SolidColorBrush Color = "RoyalBlue" />
</Border.BorderBrush>
</Border>
</Popup>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property = "Icon" Value = "{x:Null}">
<Setter TargetName = "Icon" Property = "Visibility" Value = "Collapsed" />
</Trigger>
<Trigger Property = "IsHighlighted" Value = "true">
<Setter Property = "Background" TargetName = "Border">
<Setter.Value>
<LinearGradientBrush EndPoint = "0.5,1" StartPoint = "0.5,0">
<GradientStop Color = "Transparent" Offset = "0" />
<GradientStop Color = "DeepSkyBlue" Offset = "1" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property = "BorderBrush" TargetName = "Border">
<Setter.Value>
<LinearGradientBrush EndPoint = "0.5,1" StartPoint = "0.5,0">
<GradientStop Color = "DeepSkyBlue" Offset = "0" />
<GradientStop Color = "Transparent" Offset = "1" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
<Trigger SourceName = "Popup" Property = "AllowsTransparency" Value = "True">
<Setter TargetName = "SubmenuBorder" Property = "CornerRadius" Value = "4" />
<Setter TargetName = "SubmenuBorder" Property = "Padding" Value = "0,3,0,3" />
</Trigger>
<Trigger Property = "IsEnabled" Value = "false">
<Setter Property = "Foreground">
<Setter.Value>
<SolidColorBrush Color = "DeepPink" />
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
Применить к дизайну:
<Grid>
<Menu Height = "24" VerticalAlignment = "Top" Style = "{DynamicResource HiMicrosoft}">
<MenuItem Header = "Media" Width = "48">
<MenuItem Header = "Open Files" Template = "{DynamicResource MI }"/>
<MenuItem Header = "Open Folder" Template = "{DynamicResource MI }"/>
<MenuItem Header = "Open Playlist" Template = "{DynamicResource MI }"/>
<MenuItem Header = "Open Recent" Template = "{DynamicResource MI }"/>
<Separator Style = "{DynamicResource {x:Static MenuItem.SeparatorStyleKey} }"/>
<MenuItem Header = "Hide" Template = "{DynamicResource MI }"/>
<MenuItem Header = "Exit" Template = "{DynamicResource MI }"/>
</MenuItem>
<MenuItem Header = "Playback" >
<MenuItem Header = "Play/Pause" Template = "{DynamicResource MI }"/>
<MenuItem Header = "Stop" Template = "{DynamicResource MI }"/>
<Separator Style = "{DynamicResource {x:Static MenuItem.SeparatorStyleKey} }" />
<MenuItem Header = "Speed" Template = "{DynamicResource MI }">
<MenuItem Header = "Stop" Template = "{DynamicResource {x:Static MenuItem.SubmenuHeaderTemplateKey}}"/>
</MenuItem>
</MenuItem>
</Menu>
</Grid>
И вот окончательный снимок экрана:

Когда я нажимаю на скорость, он ничего не показывает. Я не могу определить ошибку или, возможно, использовал неправильный метод.
Любая помощь будет оценена!
Если хотите, я могу предоставить более подробную информацию. Просто прокомментируйте ниже.
Заранее спасибо!





Я вижу две ошибки. Сначала вы назначили неправильный шаблон для заголовка подменю:
<MenuItem Header = "Speed" Template = "{DynamicResource MI }">
<MenuItem Header = "Stop"
Template = "{DynamicResource {x:Static MenuItem.SubmenuHeaderTemplateKey}}"/>
</MenuItem>
</MenuItem>
Думаю, должно быть:
<MenuItem Header = "Speed" Template = "{DynamicResource {x:Static MenuItem.SubmenuHeaderTemplateKey}}">
<MenuItem Header = "Stop"
Template = "{DynamicResource MI }"/>
</MenuItem>
</MenuItem>
Второе: в подменю нет места, куда ставить элементы подменю. В шаблоне вам понадобится что-то вроде следующего. Обратите внимание на панель стека со свойством IsItemsHost. Это свойство указывает, где должны быть размещены элементы подменю:
<Popup x:Name = "Popup"
Placement = "Right"
HorizontalOffset = "-4"
IsOpen = "{TemplateBinding IsSubmenuOpen}"
AllowsTransparency = "True"
Focusable = "False"
PopupAnimation = "Fade">
<Border x:Name = "SubmenuBorder"
SnapsToDevicePixels = "True"
Background = "RoyalBlue"
BorderThickness = "1"
BorderBrush = "RoyalBlue">
<StackPanel IsItemsHost = "True" />
</Border>
</Popup>
@Abhiverma - я добавил к своему ответу, поскольку обнаружил еще одно упущение.
Замечательный, достойный ответ. Большое спасибо, братан.
Не работает, потому что оба моих шаблона почти одинаковы. Вы можете сказать, что я не знаю разницы между шаблоном меню заголовка и подзаголовком. Я новичок, не такой эксперт, как вы, но не могли бы вы подсказать, что мне делать?