我喜欢对子级有一个菜单如下所示:动态和静态的MenuItems,无论是在主菜单,文本菜单
┌──────────────────────────┐
│ MenuItem always the same │
│ <Separator /> │
│ MenuItem read from XML 1 │
│ MenuItem read from XML 2 │
│ MenuItem read from XML n │
└──────────────────────────┘
,这应该在主菜单,为文本菜单还的子菜单中重复使用。
我现在有在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 [email protected], StringFormat={}{0}}"
Tag="{Binding [email protected]}" MouseLeftButtonUp="AddItemMenu_Click"
MouseRightButtonUp="AddItemMenu_Click" />
</HierarchicalDataTemplate>
它显示是这样的:
如果我将其设置为这一个:
<HierarchicalDataTemplate DataType="ItemType">
<MenuItem Header="{Binding [email protected], StringFormat={}{0}}"
Tag="{Binding [email protected]}" MouseLeftButtonUp="AddItemMenu_Click"
MouseRightButtonUp="AddItemMenu_Click" />
</HierarchicalDataTemplate>
它显示这样:
我该如何将它设置为正常显示正常的菜单项?
请不,根据以往的研究,为<collections:ArrayList x:Key="mnuAdd" x:Shared="False">
是强制性的,因为我想无论是在主菜单,文本菜单中所显示的相同的静态资源。如果我不使用它,其中一个消失。
UPDATE 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 [email protected], StringFormat={}{0}}"
Tag="{Binding [email protected]}" MouseLeftButtonUp="AddItemMenu_Click"
MouseRightButtonUp="AddTestItemMenu_Click"
Margin="-30,0,-60,0" Padding="30,0,60,0" HorizontalAlignment="Stretch" />
</DataTemplate>
现在看起来不错,效果很好。
您应该使静态资源不共享,而不是... –
它究竟如何解决显示问题? –
好吧,实际上你可以通过不把任何UI元素放入你的列表中,并让'Menu' /'ContextMenu'处理UI的创建来解决它,但我想在这里使用'x:Shared'是可行的。 –