在WP7 xaml中共享上下文菜单
我想向列表框中的项目添加上下文菜单。通常,答案是将contextmenu添加到项目模板的根目录中。但是,我使用的是一个模板选择器,因此有多个模板在使用,具体取决于列表框中每个项目的数据。这意味着我需要向每个模板添加相同的contextmenu定义,这不是很吸引人 一种解决方案是将datatemplate包装在ContentControl中,这将为上下文菜单定义提供一个单独的位置。然而,我相信这会增加不必要的布局开销 我尝试的另一个解决方案是将ContextMenu添加到资源字典中,但我相信这最终会在所有使用中共享同一个对象实例,并且由于ContextMenu的实现方式,这也不起作用 第三种解决方案是使用在WP7 xaml中共享上下文菜单,xaml,windows-phone-7,Xaml,Windows Phone 7,我想向列表框中的项目添加上下文菜单。通常,答案是将contextmenu添加到项目模板的根目录中。但是,我使用的是一个模板选择器,因此有多个模板在使用,具体取决于列表框中每个项目的数据。这意味着我需要向每个模板添加相同的contextmenu定义,这不是很吸引人 一种解决方案是将datatemplate包装在ContentControl中,这将为上下文菜单定义提供一个单独的位置。然而,我相信这会增加不必要的布局开销 我尝试的另一个解决方案是将ContextMenu添加到资源字典中,但我相信这最终
Loaded
事件调用适当填充上下文菜单的函数。然而,这最终会将大量本应在XAML中的代码移动到代码中,并且看起来相当难看。如果有某种方法在xaml中定义上下文菜单,然后从代码中引用它,我会觉得它很吸引人,但我不太明白如何做到这一点
在模板选择器中跨模板共享同一ContextMenu的正确方法是什么
这是ContentControl方法,它可以工作,但最终会向每个项添加两个内容控件:
<ListBox.ItemTemplate>
<DataTemplate>
<ContentControl>
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu Loaded="ContextMenu_Loaded">
<toolkit:MenuItem Header="Delete"/>
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
<ContentControl ContentTemplate="{StaticResource MyTemplate}" Content="{Binding}"/>
</ContentControl>
</DataTemplate>
</ListBox.ItemTemplate>
如何将ContextMenu添加到TemplateSelector
<ListBox ItemsSource="{Binding}">
<ListBox.Resources>
<DataTemplate x:Key="MyTemplate">
<StackPanel>
<TextBlock Text="{Binding}" />
</StackPanel>
</DataTemplate>
</ListBox.Resources>
<ListBox.ItemTemplate>
<DataTemplate>
<local:CustomTemplateSelector Content="{Binding}">
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu>
<toolkit:MenuItem Header="Delete"
Click="MenuItem_Click" />
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
<local:CustomTemplateSelector.TemplateOne>
<DataTemplate>
<ContentControl Content="{Binding}"
ContentTemplate="{StaticResource MyTemplate}"
Foreground="Blue" />
</DataTemplate>
</local:CustomTemplateSelector.TemplateOne>
<local:CustomTemplateSelector.TemplateTwo>
<DataTemplate>
<ContentControl Content="{Binding}"
ContentTemplate="{StaticResource MyTemplate}"
Foreground="Red" />
</DataTemplate>
</local:CustomTemplateSelector.TemplateTwo>
<local:CustomTemplateSelector.TemplateThree>
<DataTemplate>
<ContentControl Content="{Binding}"
ContentTemplate="{StaticResource MyTemplate}"
Foreground="Yellow" />
</DataTemplate>
</local:CustomTemplateSelector.TemplateThree>
</local:CustomTemplateSelector>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我运行了这个,它对我很有效-试试看,让我知道这是否是您想要的效果。将ContextMenu添加到TemplateSelector如何
<ListBox ItemsSource="{Binding}">
<ListBox.Resources>
<DataTemplate x:Key="MyTemplate">
<StackPanel>
<TextBlock Text="{Binding}" />
</StackPanel>
</DataTemplate>
</ListBox.Resources>
<ListBox.ItemTemplate>
<DataTemplate>
<local:CustomTemplateSelector Content="{Binding}">
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu>
<toolkit:MenuItem Header="Delete"
Click="MenuItem_Click" />
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
<local:CustomTemplateSelector.TemplateOne>
<DataTemplate>
<ContentControl Content="{Binding}"
ContentTemplate="{StaticResource MyTemplate}"
Foreground="Blue" />
</DataTemplate>
</local:CustomTemplateSelector.TemplateOne>
<local:CustomTemplateSelector.TemplateTwo>
<DataTemplate>
<ContentControl Content="{Binding}"
ContentTemplate="{StaticResource MyTemplate}"
Foreground="Red" />
</DataTemplate>
</local:CustomTemplateSelector.TemplateTwo>
<local:CustomTemplateSelector.TemplateThree>
<DataTemplate>
<ContentControl Content="{Binding}"
ContentTemplate="{StaticResource MyTemplate}"
Foreground="Yellow" />
</DataTemplate>
</local:CustomTemplateSelector.TemplateThree>
</local:CustomTemplateSelector>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我运行了这个程序,它对我很有效-尝试一下,让我知道这是否是您想要的效果。正是我所需要的。谢谢你的帮助,正是我需要的。谢谢你的帮助。