2010-06-25 8 views
3

J'essaie d'implémenter ce que je tenais pour acquis dans les applications Winforms. Je suis un Noble Silverlight, donc j'espère que tout cela est élémentaire. J'ai une liste dans une application Silverlight 4. Je voudrais faire ce qui suit:Cliquez avec le bouton droit sur une zone de liste dans une application Silverlight 4

  1. Faites un clic droit sur la zone de liste
  2. Avez l'élément sous l'endroit où je clique se mettre en évidence
  3. Je voudrais un menu contextuel pop-up (avec mon propres éléments dans le menu contextuel)

de mes recherches à ce jour, il semble qu'il n'y a pas ContextMenu construire dans Silverlight, au contraire, nous devons construire une grille/structure de toile et l'attacher à un objet Popup, qui est ce qui est alors apparu.

Mes questions sont les suivantes:

  1. Pour accomplir # 2, je besoin d'une sorte de test de recherche sur la zone de liste. Je n'arrive pas à comprendre comment faire ça et mon google-fu n'aide pas.
  2. Une fois que j'identifie l'index sous la souris, comment puis-je sélectionner l'élément?
  3. Existe-t-il un composant de menu contextuel réutilisable quelque part que je puisse utiliser? Crédit supplémentaire si le composant autorise des sous-menus arbitraires.

Répondre

3

J'ai regardé autour pour la même chose.J'ai vérifié le Silverlight Control Toolkit à CodePlex et je suis allé dans les échantillons (il est une ressource très pratique) et voici ce que je trouve être la solution à ce que vous avez demandé:

  1. Créer un ItemTemplate pour votre ListBox

  2. dans la partie que vous voulez être « droit cliquable » de votre ItemTemplate définir la propriété attachée ContextMenuService.ContextMenu qui existe au sein de l'espace de noms System.Windows.Controls.Input.Toolkit

  3. ajouter MenuItem contrôles dans votre ContextMenu et définissez la propriété Cliquez pour la cl correspondant gestionnaire d'événements ick

  4. dans le gestionnaire d'événements, obtenir le DataContext de l'expéditeur (vous pouvez l'utiliser pour trouver l'élément correspondant dans la zone de liste)

  5. pour faire cet élément sélectionné, juste définir la propriété SelectedItem dans la zone de liste à elle

  6. Ajouter une logique personnalisée au gestionnaire d'événements

il y a un exemple dans la page d'échantillons, allez à « Input-> ContextMenu » de t Le volet de navigation.

Si vous voulez quelque chose concise, voici un exemple simplifié:

<ListBox ItemsSource="{StaticResource People}" 
      Name="myListBox"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Name}"> 
        <controlsInputToolkit:ContextMenuService.ContextMenu> 
         <controlsInputToolkit:ContextMenu> 
          <controlsInputToolkit:MenuItem Header="Show in MessageBox" 
                  Click="show_Click" /> 
         </controlsInputToolkit:ContextMenu> 
        </controlsInputToolkit:ContextMenuService.ContextMenu> 
       </TextBlock> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
</ListBox> 

avec:

xmlns:controlsInputToolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit" 

pour le code:

private void show_Click(object sender, RoutedEventArgs e) 
    { 
     var person = ((MenuItem)sender).DataContext as Person; 
     if (null == person) return; 
     MessageBox.Show("My Name is: " + person.Name); 
     myListBox.SelectedItem = person; 
    } 

J'espère que cela aide :)

1

Il existe l'événement MouseRightButtonDown. Si vous liez que sur la ListBox:

<ListBox Height="143" Name="listBox1" Width="218" 
     MouseRightButtonDown="listBox1_MouseRightButtonDown" /> 

vous obtiendrez ce dont vous avez besoin. Le code se cache derrière:

private void listBox1_MouseRightButtonDown(object sender, MouseButtonEventArgs e) 
{ 
} 

Le MouseButtonEventArgs vous donnera la position via la méthode GetPosition.

Questions connexes