[英]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.