我在.NET Framework的WPF应用程序中使用了MVVM菜单方法。转换为.NET Core 3.1后,该方法不再起作用。
问题:这是WPF中的错误吗?有人知道解决方案或解决方法吗?
。NET Framework 4.7.2的最终结果。
。NET Core 3.1中的相同代码将在MenuItem(?)中显示MenuItem。子菜单不出现。
这里是视图模型的简化版本。
using System.Collections.ObjectModel;
namespace WpfMenuFw
{
class MainVm
{
public ObservableCollection<MenuVm> MenuVms { get; set; } = new ObservableCollection<MenuVm>();
}
abstract class MenuVm
{
}
class MenuSeparatorVm : MenuVm
{
}
class MenuItemVm : MenuVm
{
public string Header { get; set; } = nameof(MenuItemVm);
}
class MenuGroupVm : MenuVm
{
public string Header { get; set; } = nameof(MenuGroupVm);
public ObservableCollection<MenuVm> MenuVms { get; set; } = new ObservableCollection<MenuVm>();
}
}
XAML
<Window
x:Class="WpfMenuFw.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfMenuFw"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="800"
Height="450"
d:DataContext="{d:DesignInstance local:MainVm}"
mc:Ignorable="d">
<Window.Resources>
<ItemContainerTemplate DataType="{x:Type local:MenuSeparatorVm}">
<Separator />
</ItemContainerTemplate>
<ItemContainerTemplate DataType="{x:Type local:MenuGroupVm}">
<MenuItem
d:DataContext="{d:DesignInstance local:MenuGroupVm}"
Header="{Binding Header}"
ItemsSource="{Binding MenuVms}"
UsesItemContainerTemplate="True" />
</ItemContainerTemplate>
<ItemContainerTemplate DataType="{x:Type local:MenuItemVm}">
<MenuItem
d:DataContext="{d:DesignInstance local:MenuItemVm}"
Header="{Binding Header}" />
</ItemContainerTemplate>
</Window.Resources>
<Window.DataContext>
<local:MainVm>
<local:MainVm.MenuVms>
<local:MenuGroupVm Header="Group 1">
<local:MenuGroupVm.MenuVms>
<local:MenuItemVm Header="Item A1" />
<local:MenuSeparatorVm />
<local:MenuItemVm Header="Item A2" />
</local:MenuGroupVm.MenuVms>
</local:MenuGroupVm>
<local:MenuGroupVm Header="Group 2">
<local:MenuGroupVm.MenuVms>
<local:MenuItemVm Header="Item B1" />
<local:MenuItemVm Header="Item B2" />
</local:MenuGroupVm.MenuVms>
</local:MenuGroupVm>
</local:MainVm.MenuVms>
</local:MainVm>
</Window.DataContext>
<DockPanel>
<Menu
DockPanel.Dock="Top"
IsMainMenu="True"
ItemsSource="{Binding MenuVms}"
UsesItemContainerTemplate="True" />
<TextBlock Text="MainContent">
<TextBlock.ContextMenu>
<ContextMenu
ItemsSource="{Binding MenuVms}"
UsesItemContainerTemplate="True" />
</TextBlock.ContextMenu>
</TextBlock>
</DockPanel>
</Window>
已报告此问题github link here
您应使用以下解决方法,直到问题解决。
为Menu或MenuItem设置项目面板的模板。
或者您可以在MenuItem的ControlTemplate中执行类似的解决方案。