2012-05-16 4 views
2

У меня есть ListBox в моем WP7, который использует ниже DataTemplete для отображения элементов спискаЗакрыть контекстное меню для DataBound элементов в WP7

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

определения шаблон данных контекстного меню делает его совершенно невозможно закрыть по нажатию меню обратная кнопка! Кто-нибудь сталкивался с этой проблемой? Как вы его решили?

Я искал решение в Интернете, но не смог найти его. Любая помощь приветствуется.

ответ

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, так что, если переменная не является нулевым, а открыто меню, затем закройте меню и отменить обратно событие.

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

     base.OnBackKeyPress(e); 

    } 

Это должно быть сделано! Дайте мне знать, если у вас есть какие-либо проблемы, или мне нужно вставить полный код.