43 votes

Double-Cliquez sur une zone de liste le point d'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, il ne fait que travailler de cette façon, ou est-il un moyen en utilisant simplement l' ListBox?

La vôtre

Sebastian

86voto

Bob King Points 12913

Vous pouvez ajouter un style à la zone de liste.ItemContainerStyle, et d'ajouter une EventSetter là:

<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.

10voto

AndrewS Points 1841

Je voulais résoudre ce sans avoir besoin de manipuler le listBoxItem double-cliquez sur l'événement dans le code-behind, et je ne voulais pas avoir à remplacer le style de listBoxItem (ou à définir le style de remplacer dans la première place). Je voulais juste déclencher une commande lorsque la zone de liste a été on double-clique sur.

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 puis déclarer ma ListBox 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>

Espérons que cette aide.

5voto

user1754813 Points 51

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X