MainMenu和ContextMenu中的动态和静态MenuItem

时间:2013-06-04 15:22:11

标签: c# wpf xaml contextmenu menuitem

我想要一个如下菜单:

┌──────────────────────────┐
│ 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>

以这种方式显示:

enter image description here

如果我把它设置为这个:

    <HierarchicalDataTemplate DataType="ItemType">
        <MenuItem Header="{Binding XPath=@DisplayName, StringFormat={}{0}}"
            Tag="{Binding XPath=@Name}" MouseLeftButtonUp="AddItemMenu_Click" 
            MouseRightButtonUp="AddItemMenu_Click" />
    </HierarchicalDataTemplate>

以这种方式显示:

enter image description here

如何将其设置为正常显示为普通菜单项?

请注意,根据之前的研究,<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,它仍然显示尴尬:

enter image description here

如果我的DataTemplate为TextBlock,则显示正常,但点击仅在文本时处理,而不是从文本中稍微留下。

enter image description here

如何让它运作良好并且看起来不错?

编辑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>

现在它看起来很好并且效果很好。

1 个答案:

答案 0 :(得分:3)

使用CompositeCollection构建列表,使用CollectionContainer作为动态部分。