簡體   English   中英

WP7 xaml中的共享上下文菜單

[英]Share context menu in WP7 xaml

我想將上下文菜單添加到列表框中的項目。 通常,答案是將上下文菜單添加到項目模板的根目錄。 但是,我使用的是模板選擇器,因此有多個模板在使用中,具體取決於列表框中每個項目的數據。 這意味着我需要為每個模板添加相同的上下文菜單定義,這並不是很吸引人。

一種解決方案是將數據模板包裝在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>

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

我運行了它,它為我工作了-試試看,讓我知道這是否是您想要的效果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM