Question

Je suis en train de mettre en œuvre ce que je l'habitude de prendre pour acquis dans les applications Winforms. Je suis un noob Silverlight, donc je l'espère tout cela est élémentaire.

J'ai une zone de liste dans une application Silverlight 4. Je voudrais faire ce qui suit:

  1. Faites un clic droit sur la zone de liste
  2. Demandez à l'élément sous l'endroit où je clique sur lui-même fort
  3. Je voudrais un menu contextuel pop-up (avec mes propres éléments dans le menu contextuel)

D'après mes recherches à ce jour, il semble qu'il n'y a pas construit ContextMenu dans Silverlight, au contraire, nous devons mettre en place une structure de grille / toile et l'attacher à un objet Popup, qui est ce qui est alors sauté vers le haut.

Mes questions sont comme suit:

  1. Pour accomplir # 2, je besoin d'une sorte de test de recherche sur la zone de liste. Je ne peux pas comprendre comment faire et mon google-fu n'aide pas.
  2. Une fois que j'identifier l'index sous la souris, comment puis-je choisir effectivement l'article?
  3. Y at-il un endroit composant de menu réutilisable contexte que je peux utiliser? Crédit supplémentaire si le composant permet de sous-menus arbitraires.
Était-ce utile?

La solution

Je l'ai regardé autour de 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 trouvé 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 régler la ContextMenuService.ContextMenu de propriété jointe qui existe au sein de l'espace de noms System.Windows.Controls.Input.Toolkit

  3. ajouter des contrôles MenuItem à votre ContextMenu et définissez la propriété Cliquez pour le gestionnaire d'événements de clic correspondant

  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 cet élément sélectionné, juste définir la propriété SelectedItem dans la zone de liste à elle

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

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

Si vous voulez quelque chose de concis, 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 cette aide:)

Autres conseils

Il y a MouseRightButtonDown événement. Si vous liez que sur le ListBox:

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

vous obtiendrez ce dont vous avez besoin. Le derrière de code est:

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top