关闭WP7中数据绑定项的上下文菜单

时间:2012-05-16 12:05:32

标签: windows-phone-7 contextmenu datatemplate

我的WP7中有一个列表框,它使用下面的DataTemplete来显示列表项

        <DataTemplate x:Key="MetaDataTemplate">
            <Grid Width="440" Margin="4,12,0,12">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="64"/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <toolkit:ContextMenuService.ContextMenu>
                    <toolkit:ContextMenu>
                        <toolkit:MenuItem Header="download" Visibility="{Binding DownloadVisible}" Command="{Binding Download}"/>
                        <toolkit:MenuItem Header="get link" Command="{Binding GetLink}"/>
                        <toolkit:MenuItem Header="delete" Command="{Binding Delete}"/>
                    </toolkit:ContextMenu>
                </toolkit:ContextMenuService.ContextMenu>                    
                <Image Height="64" Width="64" Source="{Binding Thumb}" Stretch="UniformToFill"  />
                <TextBlock Text="{Binding MetaData.Name, Mode=OneWay}" VerticalAlignment="Center" Margin="12,0,0,0" 
                           Style="{StaticResource MetaDataHeaderStyle}" Grid.Column="1" />
            </Grid>
        </DataTemplate>

定义上下文菜单数据模板使得按下后退按钮时关闭菜单变得十分不可能!有人遇到过这个问题吗?你是怎么解决的?

我在互联网上搜索解决方案,但找不到。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:3)

一种方法是在后面的代码中使用ContextMenu变量,并为模板中的ContextMenu的Opened事件提供事件处理程序。

<toolkit:ContextMenuService.ContextMenu>
                        <toolkit:ContextMenu Opened="ContextMenu_Opened">
                            <toolkit:MenuItem Header="stuff">

                            </toolkit:MenuItem>
                            <toolkit:MenuItem Header="more stuff">

                            </toolkit:MenuItem>
                        </toolkit:ContextMenu>
                    </toolkit:ContextMenuService.ContextMenu>

Opened事件处理程序中,将ContextMenu变量设置为该实例(即发件人)。

private void ContextMenu_Opened(object sender, RoutedEventArgs e)
    {
        menu = sender as ContextMenu;
    }

最后,覆盖OnBackKeyPress,这样如果变量不为null,并且菜单已打开,则关闭菜单并取消后退事件。

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
    {
        if (menu != null && menu.IsOpen)
        {
            menu.IsOpen = false;
            e.Cancel = true;
        }

        base.OnBackKeyPress(e);

    }

应该这样做!如果您有任何问题,请告诉我,或者需要我粘贴完整的代码。