次のようなメニューを作りたいと思っています。
┌──────────────────────────┐
│ 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:
HBによると、次のように変更されまし<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>
今では見栄えが良く、うまく機能しています。