Double-cliquez sur un élément de liste pour ouvrir un navigateur

j'ai un ListBox dans ma fenêtre wpf qui se lie à un ObervableCollection. Je veux ouvrir le navigateur si quelqu'un clique sur un élément de l' ListBox (tout comme un lien). Quelqu'un peut-il me dire comment faire cela? J'ai trouvé quelque chose avec listboxviews, est-ce que ça ne marche que de cette façon ou est-ce qu'il y a un moyen en utilisant le ListBox?

la vôtre

Sebastian

41
demandé sur Dave Clemmer 2009-05-04 23:25:26

4 réponses

Vous pouvez ajouter un style à zone de liste.ItemContainerStyle, et ajouter un EventSetter il y a:

<ListBox>
    ....
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}">
            <EventSetter Event="MouseDoubleClick" Handler="ListBoxItem_MouseDoubleClick"/>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

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

81
répondu Bob King 2009-05-04 19:33:29

je voulais résoudre ce problème sans avoir à gérer l'événement de double clic listBoxItem dans le code-behind, et je ne voulais pas avoir à Outrepasser le style listBoxItem (ou définir le style à outrepasser en premier lieu). Je voulais juste lancer une commande quand la liste était doubleclicked.

j'ai créé une propriété attachée comme (le code est très spécifique, mais vous pouvez généraliser 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 alors ma liste avec la propriété attachée et ma cible de commande:

<ListBox ItemsSource="{Binding SomeItems}"
     myStuff:ControlItemDoubleClick.ItemsDoubleClick="true">
<ListBox.InputBindings>
    <MouseBinding MouseAction="LeftDoubleClick" Command="MyCommand"/>
</ListBox.InputBindings>
</ListBox>

J'espère que cela vous aidera.

10
répondu AndrewS 2009-05-19 14:45:09

J'ai mis à jour la solution AndrewS afin de résoudre le problème avec le tir exécution de la commande Si double clic n'importe où dans la boîte 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 pour la liste est:

<ListBox ItemsSource="{Binding MyItemsSource, Mode=OneWay}">                    
      <ListBox.ItemContainerStyle>
                    <Style>                            
                        <Setter Property="behaviours:ControlDoubleClick.Command" Value="{Binding DataContext.MyCommand,
                                    RelativeSource={RelativeSource FindAncestor, 
                                    AncestorType={x:Type UserControl}}}"/>
                     </Style>  
     </ListBox.ItemContainerStyle>
</ListBox>
6
répondu Vadim Tofan 2014-10-10 14:07:02

J'ai utilisé L'Expression SDK 4.0

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

<i:Interaction.Triggers>
  <i:EventTrigger EventName="MouseDoubleClick" SourceName="CaravanasListBox">
     <i:InvokeCommandAction Command="{Binding AccionesToolbarCommand}" CommandParameter="{x:Static local:OpcionesBarra.MostrarDetalle}" />
   </i:EventTrigger>
</i:Interaction.Triggers>

Jaimir G.

5
répondu user1754813 2012-11-05 15:12:05