2

我的 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>

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

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

4

1 回答 1

3

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

<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);

    }

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

于 2012-05-17T02:09:50.700 回答