在WP7 xaml中共享上下文菜单

时间:2011-08-03 03:05:22

标签: xaml windows-phone-7

我想在列表框中的项目中添加上下文菜单。通常,答案是将contextmenu添加到项模板的根目录。但是,我使用的是模板选择器,因此正在使用多个模板,具体取决于列表框中每个项目的数据。这意味着我需要为每个模板添加相同的contextmenu定义,这不是很吸引人。

一种解决方案是将datatemplate包装在ContentControl中,这将为上下文菜单定义提供一个位置。但是,我认为这会增加不必要的布局开销。

我尝试的另一个解决方案是将ContextMenu添加到资源字典中,但我相信这最终会在所有用途中共享相同的对象实例,并且由于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>

1 个答案:

答案 0 :(得分:1)

如何将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>

我跑了这个,它对我有用 - 尝试一下,让我知道这是否是你正在寻找的效果。