我想要一个如下菜单:
┌──────────────────────────┐
│ MenuItem always the same │
│ <Separator /> │
│ MenuItem read from XML 1 │
│ MenuItem read from XML 2 │
│ MenuItem read from XML n │
└──────────────────────────┘
这应该在MainMenu中重用,也可以作为ContextMenu的子菜单重用。
我目前在XAML中有以下内容:
<Window.Resources>
<XmlDataProvider x:Key="ItemTypes" Source="C:\Config.xml"
XPath="Configuration/ItemTypes/ItemType" />
<collections:ArrayList x:Key="mnuAdd" x:Shared="False">
<MenuItem Command="local:MainWindow.AddItemGroup" Header="Item Group" />
<Separator />
<ItemsControl ItemsSource="{Binding Source={StaticResource ItemTypes}}" />
</collections:ArrayList>
</Window.Resources>
在XML中有以下内容:
<Configuration>
<ItemTypes>
<ItemTypeName="Item1" DisplayName="First Item" />
<ItemTypeName="Item2" DisplayName="Second Item" />
</ItemTypes>
</Configuration>
当然我有HierarchicalDataTemplate,但它永远不会正确显示。
如果我把它设置为这个:
<HierarchicalDataTemplate DataType="ItemType">
<TextBlock Text="{Binding XPath=@DisplayName, StringFormat={}{0}}"
Tag="{Binding XPath=@Name}" MouseLeftButtonUp="AddItemMenu_Click"
MouseRightButtonUp="AddItemMenu_Click" />
</HierarchicalDataTemplate>
以这种方式显示:
如果我把它设置为这个:
<HierarchicalDataTemplate DataType="ItemType">
<MenuItem Header="{Binding XPath=@DisplayName, StringFormat={}{0}}"
Tag="{Binding XPath=@Name}" MouseLeftButtonUp="AddItemMenu_Click"
MouseRightButtonUp="AddItemMenu_Click" />
</HierarchicalDataTemplate>
以这种方式显示:
如何将其设置为正常显示为普通菜单项?
请注意,根据之前的研究,<collections:ArrayList x:Key="mnuAdd" x:Shared="False">
是强制性的,因为我希望在MainMenu和ContextMenu中显示相同的静态资源。如果我不使用它,其中一个就会消失。
更新1:
根据H.B.已将<collections:ArrayList>
更改为CompositeCollection
:
<CompositeCollection x:Key="mnuAdd" x:Shared="False">
<MenuItem Command="local:MainWindow.AddItemGroup" Header="Item Group" />
<Separator />
<CollectionContainer Collection="{Binding Source={StaticResource ItemTypes}}" />
</CompositeCollection>
现在,如果我的DataTemplate为MenuItem
,它仍然显示尴尬:
如果我的DataTemplate为TextBlock
,则显示正常,但点击仅在文本上时处理,而不是从文本中稍微留下。
如何让它运作良好并且看起来不错?
编辑2:
通过以下方式水平扩展TextBlock
来管理以解决点击问题:
<DataTemplate DataType="ItemType">
<TextBlock Text="{Binding XPath=@DisplayName, StringFormat={}{0}}"
Tag="{Binding XPath=@Name}" MouseLeftButtonUp="AddItemMenu_Click"
MouseRightButtonUp="AddTestItemMenu_Click"
Margin="-30,0,-60,0" Padding="30,0,60,0" HorizontalAlignment="Stretch" />
</DataTemplate>
现在它看起来很好并且效果很好。