Que dois-je faire pour référencer l'événement de double-clic pour un contrôle ListView?
J'utilise quelque chose comme ceci pour déclencher uniquement sur ListViewItem un double-clic et non pas par exemple lorsque vous double-cliquez sur l'en-tête du ListView.
private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
DependencyObject obj = (DependencyObject)e.OriginalSource;
while (obj != null && obj != myListView)
{
if (obj.GetType() == typeof(ListViewItem))
{
// Do something here
MessageBox.Show("A ListViewItem was double clicked!");
break;
}
obj = VisualTreeHelper.GetParent(obj);
}
}
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<EventSetter Event="MouseDoubleClick" Handler="listViewItem_MouseDoubleClick" />
</Style>
</ListView.ItemContainerStyle>
La seule difficulté est alors, si vous êtes intéressé par l’objet sous-jacent, listviewitem mappe par ex.
private void listViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
ListViewItem item = sender as ListViewItem;
object obj = item.Content;
}
private void positionsListView_DoubleClick(object sender, EventArgs e)
{
if (positionsListView.SelectedItems.Count == 1)
{
ListView.SelectedListViewItemCollection items = positionsListView.SelectedItems;
ListViewItem lvItem = items[0];
string what = lvItem.Text;
}
}
Utilisez la méthode ListView.HitTest
private void listView_MouseDoubleClick(object sender, MouseEventArgs e)
{
var senderList = (ListView) sender;
var clickedItem = senderList.HitTest(e.Location).Item;
if (clickedItem != null)
{
//do something
}
}
Ou à l'ancienne
private void listView_MouseDoubleClick(object sender, MouseEventArgs e)
{
var senderList = (ListView) sender;
if (senderList.SelectedItems.Count == 1 && IsInBound(e.Location, senderList.SelectedItems[0].Bounds))
{
//Do something
}
}
public bool IsInBound(Point location, Rectangle bound)
{
return (bound.Y <= location.Y &&
bound.Y + bound.Height >= location.Y &&
bound.X <= location.X &&
bound.X + bound.Width >= location.X);
}
J'avais besoin de ça aussi. J'ai trouvé ça sur msdn:
http://msdn.Microsoft.com/en-us/library/system.windows.forms.listview.activation.aspx
Je pense que ce délégué est pour ça.
Je n'ai pas encore un score de réputation assez important pour ajouter un commentaire là où cela serait le plus utile, mais cela concerne les personnes qui demandent une solution .Net 4.5.
Vous pouvez utiliser les coordonnées X et Y de la souris et la méthode ListView GetItemAt pour rechercher l'élément sur lequel l'utilisateur a cliqué.
private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
ListViewItem item = myListView.GetItemAt(e.X, e.Y)
// Do something here
}
pour moi, je double-clique sur ListView dans cette section de code.
this.listView.Activation = ItemActivation.TwoClick;
this.listView.ItemActivate += ListView1_ItemActivate;
ItemActivate spécifie comment l'utilisateur active avec les éléments
Lorsque l'utilisateur double-clique, ListView1_ItemActivate sera trigger . La propriété de ListView ItemActivate fait référence à l'accès à la collection d'éléments sélectionnés.
private void ListView1_ItemActivate(Object sender, EventArgs e)
{
foreach (ListViewItem item in listView.SelectedItems)
//do something
}
ça marche pour moi.
J'ai trouvé ceci sur Microsoft Dev Center. Cela fonctionne correctement et ignore le double-clic aux mauvais endroits. Comme vous le voyez, le fait est qu'un élément est sélectionné avant le déclenchement de l'événement en double-clic.
private void listView1_DoubleClick(object sender, EventArgs e)
{
// user clicked an item of listview control
if (listView1.SelectedItems.Count == 1)
{
//do what you need to do here
}
}
http://social.msdn.Microsoft.com/forums/en-US/winforms/thread/588b1053-8a8f-44ab-8b44-2e42062fb663
Vous pouvez obtenir d’abord le ListView, puis le Selected ListViewItem . J'ai un exemple pour ListBox, mais ListView devrait être similaire.
private void listBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
ListBox box = sender as ListBox;
if (box == null) {
return;
}
MyInfo info = box.SelectedItem as MyInfo;
if (info == null)
return;
/* your code here */
}
e.Handled = true;
}
Voici comment obtenir l'objet sélectionné et le code de correspondance d'objet pour l'élément listview double-cliqué dans une listview WPF:
/// <summary>
/// Get the object from the selected listview item.
/// </summary>
/// <param name="LV"></param>
/// <param name="originalSource"></param>
/// <returns></returns>
private object GetListViewItemObject(ListView LV, object originalSource)
{
DependencyObject dep = (DependencyObject)originalSource;
while ((dep != null) && !(dep.GetType() == typeof(ListViewItem)))
{
dep = VisualTreeHelper.GetParent(dep);
}
if (dep == null)
return null;
object obj = (Object)LV.ItemContainerGenerator.ItemFromContainer(dep);
return obj;
}
private void lvFiles_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
object obj = GetListViewItemObject(lvFiles, e.OriginalSource);
if (obj.GetType() == typeof(MyObject))
{
MyObject MyObject = (MyObject)obj;
// Add the rest of your logic here.
}
}
L'expéditeur est de type ListView et non ListViewItem.
private void listViewTriggers_MouseDoubleClick(object sender, MouseEventArgs e)
{
ListView triggerView = sender as ListView;
if (triggerView != null)
{
btnEditTrigger_Click(null, null);
}
}
Avait un problème similaire avec un ListBox voulant ouvrir une fenêtre (vue différente) avec le SelectedItem comme contexte (dans mon cas, je peux donc le modifier).
Les trois options que j'ai trouvées sont les suivantes: 1. Code Derrière 2. Utilisation de comportements attachés 3. Utilisation de i: Interaction et EventToCommand de Blend à l'aide de MVVM-Light.
Je suis allé avec la 3ème option, et ça ressemble à ça:
<ListBox x:Name="You_Need_This_Name"
ItemsSource="{Binding Your_Collection_Name_Here}"
SelectedItem="{Binding Your_Property_Name_Here, UpdateSourceTrigger=PropertyChanged}"
... rest of your needed stuff here ...
>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<Command:EventToCommand Command="{Binding Your_Command_Name_Here}"
CommandParameter="{Binding ElementName=You_Need_This_Name,Path=SelectedItem}" />
</i:EventTrigger>
</i:Interaction.Triggers>
C'est à peu près tout ... quand vous double-cliquez sur l'élément souhaité, votre méthode sur le ViewModel sera appelée avec le paramètre SelectedItem, et vous pourrez y faire ce que vous voulez :)
C'est agaçant, mais la meilleure façon de le faire est quelque chose comme:
<DataTemplate Name="MyCoolDataTemplate">
<Grid Loaded="HookLVIClicked" Tag="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}}">
<!-- your code here -->
</Grid>
</DataTemplate>
Puis dans le code:
public void HookLVIClicked(object sender, RoutedEventArgs e) {
var fe = (FrameworkElement)sender;
var lvi = (ListViewItem)fe.Tag;
lvi.MouseDoubleClick += MyMouseDoubleClickHandler;
}
Dans l’événement ListBox DoubleClick, récupérez le ou les éléments sélectionnés dans la liste, et vous y êtes.
void ListBox1DoubleClick(object sender, EventArgs e)
{
MessageBox.Show(string.Format("SelectedItem:\n{0}",listBox1.SelectedItem.ToString()));
}
Utilisez l’événement MouseDoubleClick et tous les événements MouseClick ont un nombre de clics dans la variable eventargs 'e'. Donc, si e.ClickCount == 2, double-cliquez dessus.