2013-06-04 28 views
0

我喜欢对子级有一个菜单如下所示:动态和静态的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> 

它显示是这样的:

enter image description here

如果我将其设置为这一个:

<HierarchicalDataTemplate DataType="ItemType"> 
     <MenuItem Header="{Binding [email protected], StringFormat={}{0}}" 
      Tag="{Binding [email protected]}" MouseLeftButtonUp="AddItemMenu_Click" 
      MouseRightButtonUp="AddItemMenu_Click" /> 
    </HierarchicalDataTemplate> 

它显示这样:

enter image description here

我该如何将它设置为正常显示正常的菜单项?

请不,根据以往的研究,为<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,它仍然显示尴尬:

enter image description here

如果我的DataTemplate是TextBlock,它显示正常,但点击次数会只处理如果是文本上的,则不是该文本稍微离开。

enter image description here

我怎样才能使它发挥作用好不好看?

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

现在看起来不错,效果很好。

+0

您应该使静态资源不共享,而不是... –

+0

它究竟如何解决显示问题? –

+0

好吧,实际上你可以通过不把任何UI元素放入你的列表中,并让'Menu' /'ContextMenu'处理UI的创建来解决它,但我想在这里使用'x:Shared'是可行的。 –

回答

3

使用CompositeCollection建立您的列表,使用CollectionContainer作为动态部分。

+0

我开始使用这种方法。有了这个,发生以下情况:如果我打开MainMenu,项目显示。然后,如果我打开ContextMenu,则会显示项目。从这一刻起,这些项目将被绑定到ContextMenu,并且每当我再次打开MainMenu时,项目将不会显示。这就是我在问题结尾处用斜体文字表示的内容。 –

+0

@ user2270404:我没有告诉你在我的答案中放入'x:Shared',这是一个可以以某种方式处理的不同问题。 –

+0

我使用集合:ArrayList或CompositeCollection。 CompositeCollection不能有x:Shared。 –