Faites un clic droit sur une zone de liste dans une application Silverlight 4
-
29-09-2019 - |
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:
- Faites un clic droit sur la zone de liste
- Demandez à l'élément sous l'endroit où je clique sur lui-même fort
- 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:
- 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.
- Une fois que j'identifier l'index sous la souris, comment puis-je choisir effectivement l'article?
- 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.
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é:
-
Créer un ItemTemplate pour votre ListBox
-
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 nomsSystem.Windows.Controls.Input.Toolkit
-
ajouter des contrôles MenuItem à votre ContextMenu et définissez la propriété Cliquez pour le gestionnaire d'événements de clic correspondant
-
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)
-
pour cet élément sélectionné, juste définir la propriété
SelectedItem
dans la zone de liste à elle -
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
.