Double-cliquez sur un élément ListBox pour ouvrir un navigateur

J’ai un ListBox dans ma fenêtre ObervableCollection qui se lie à un ObervableCollection . Je veux ouvrir le navigateur si quelqu’un clique sur un élément du ListBox (comme un lien). Est-ce que quelqu’un peut me dire comment faire ça? J’ai trouvé quelque chose avec listboxviews, cela fonctionne-t-il seulement de cette façon ou existe-t-il un moyen d’utiliser simplement le ListBox ?

Le tiens

Sebastian

Vous pouvez append un style à ListBox.ItemContainerStyle et y append un EventSetter :

  ....     

ListBoxItem_MouseDoubleClick est une méthode dans votre code avec la signature correcte pour MouseDoubleClick .

Je voulais résoudre ce problème sans avoir à gérer l’événement double clic listBoxItem dans le code-behind, et je ne voulais pas avoir à remplacer le style listBoxItem (ou définir le style à remplacer en premier lieu). Je voulais juste déclencher une commande lorsque le contrôle listBox était double.

J’ai créé une propriété attachée comme ça (le code est très spécifique, mais vous pouvez le généraliser si nécessaire):

 public class ControlItemDoubleClick : DependencyObject { public ControlItemDoubleClick() { } public static readonly DependencyProperty ItemsDoubleClickProperty = DependencyProperty.RegisterAttached("ItemsDoubleClick", typeof(bool), typeof(Binding)); public static void SetItemsDoubleClick(ItemsControl element, bool value) { element.SetValue(ItemsDoubleClickProperty, value); if (value) { element.PreviewMouseDoubleClick += new MouseButtonEventHandler(element_PreviewMouseDoubleClick); } } static void element_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) { ItemsControl control = sender as ItemsControl; foreach (InputBinding b in control.InputBindings) { if (!(b is MouseBinding)) { continue; } if (b.Gesture != null && b.Gesture is MouseGesture && ((MouseGesture)b.Gesture).MouseAction == MouseAction.LeftDoubleClick && b.Command.CanExecute(null)) { b.Command.Execute(null); e.Handled = true; } } } public static bool GetItemsDoubleClick(ItemsControl element) { return (bool)element.GetValue(ItemsDoubleClickProperty); } 

}

Je déclare ensuite mon ListBox avec la propriété attachée et ma commande cible:

      

J’espère que cela t’aides.

J’ai mis à jour la solution AndrewS afin de résoudre le problème lié à l’exécution de la commande si vous double-cliquez n’importe où dans la zone de liste:

 public class ControlDoubleClick : DependencyObject { public static readonly DependencyProperty CommandProperty = DependencyProperty.RegisterAttached("Command", typeof(ICommand), typeof(ControlDoubleClick), new PropertyMetadata(OnChangedCommand)); public static ICommand GetCommand(Control target) { return (ICommand)target.GetValue(CommandProperty); } public static void SetCommand(Control target, ICommand value) { target.SetValue(CommandProperty, value); } private static void OnChangedCommand(DependencyObject d, DependencyPropertyChangedEventArgs e) { Control control = d as Control; control.PreviewMouseDoubleClick += new MouseButtonEventHandler(Element_PreviewMouseDoubleClick); } private static void Element_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) { Control control = sender as Control; ICommand command = GetCommand(control); if (command.CanExecute(null)) { command.Execute(null); e.Handled = true; } } } 

Et dans le XAML, la déclaration du ListBox est la suivante:

      

J’ai utilisé Expression SDK 4.0

 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"      

Jaimir G.