2009-05-30 14 views

risposta

34

Sto usando qualcosa del genere per attivare solo su ListViewItem doppio clic e non per esempio quando si fa doppio clic sull'intestazione del 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); 
    } 
} 
+2

Questo non funziona più in .net 4.5. MouseButtonEventArgs non ha una fonte (originale). – Harmen

+1

@Harmen qualsiasi soluzione in *** *** 4,5 ***? –

+0

Ecco una soluzione basata su eventi del ListViewItem: https://stackoverflow.com/questions/728205/wpf-listview-attaching-a-double-click-on-an-item-event – Kosau

0

Nell'evento ListBox DoubleClick ottenere il membro selecteditem della casella di riepilogo, e ci sei.

void ListBox1DoubleClick(object sender, EventArgs e) 
    { 
     MessageBox.Show(string.Format("SelectedItem:\n{0}",listBox1.SelectedItem.ToString())); 
    } 
+0

Se utilizzo l'evento doppio clic di ListBox, posso fare doppio clic in qualsiasi punto della listview e se verrà selezionato qualsiasi elemento selezionato. Non ne ho bisogno. Ho bisogno dell'elemento cliccato solo su quando è stato fatto doppio clic. – Sauron

+0

Questo non funziona, perché si noteranno i doppi clic sulla barra di scorrimento o altri luoghi scomodi –

0

O utilizzare l'evento MouseDoubleClick, e anche, tutti gli eventi click del mouse hanno un numero di clic nelle EventArgs variabile 'E'. Quindi, se e.ClickCount == 2, quindi doppio clic.

0

E 'fastidioso, ma il modo migliore per farlo è qualcosa di simile:

<DataTemplate Name="MyCoolDataTemplate"> 
    <Grid Loaded="HookLVIClicked" Tag="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}}"> 
     <!-- your code here --> 
    </Grid> 
</DataTemplate> 

Poi nel codice:

public void HookLVIClicked(object sender, RoutedEventArgs e) { 
    var fe = (FrameworkElement)sender; 
    var lvi = (ListViewItem)fe.Tag; 
    lvi.MouseDoubleClick += MyMouseDoubleClickHandler; 
} 
59
<ListView.ItemContainerStyle> 
    <Style TargetType="ListViewItem"> 
     <EventSetter Event="MouseDoubleClick" Handler="listViewItem_MouseDoubleClick" /> 
    </Style> 
</ListView.ItemContainerStyle> 

L'unica difficoltà è allora se si sono interessati all'oggetto sottostante, ad esempio le mappe listviewitem

private void listViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    ListViewItem item = sender as ListViewItem; 
    object obj = item.Content; 
} 
+0

Questo non ha funzionato per me su .NET 3.5 (VS 2008). Tuttavia, PreviewMouseDoubleClick ha funzionato. Ha qualcosa a che fare con l'evento che bolle. – NickV

+1

Questo funziona per me in .net 3.5, tuttavia se si verificano problemi con l'evento che bolle in alto è possibile aggiungere e.Handled = true; per impedirgli di andare oltre questo metodo. – esde84

+0

Funziona perfettamente in .NET 4.5 e 4.6. –

1

L'ho trovato su Microsoft Dev Center. Funziona correttamente e ignora il doppio clic nei posti sbagliati. Come vedi, il punto è che un elemento viene selezionato prima che venga attivato l'evento del doppio 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

+0

Questo non ignora il doppio clic nei posti sbagliati in .net 4.5 o superiore. Se selezioni un elemento e fai doppio clic da qualche altra parte, agisci sull'elemento selezionato con questo codice. –

8
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; 

     } 
    } 
+2

'ListViewItem lvItem = positionsListView.SelectedItems [0];' è più ordinato – BaSsGaz

0

stava avendo un problema simile con un ListBox voler aprire una finestra (Different View) con la SelectedItem come il contesto (nel mio caso, così posso modificarlo).

Le tre opzioni che ho trovato sono: 1. Codice dietro 2. Utilizzo dei comportamenti associati 3. Utilizzo di Blend i: Interaction ed EventToCommand utilizzando MVVM-Light.

sono andato con l'opzione 3, e sembra qualcosa in queste righe:

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

che su di esso ... quando si fa doppio clic sulla voce che si desidera, sarà chiamato il metodo sul ViewModel con SelectedItem come parametro, e puoi fare quello che vuoi lì :)

3

per me, faccio doppio clic su ListView in questa sezione di codice.

this.listView.Activation = ItemActivation.TwoClick; 

    this.listView.ItemActivate += ListView1_ItemActivate; 

ItemActivate specify how user activate with items

Quando l'utente fa doppio clic, ListView1_ItemActivate sarà grilletto. Proprietà di ListView ItemActivate fa riferimento all'accesso alla raccolta di elementi selezionati.

private void ListView1_ItemActivate(Object sender, EventArgs e) 
    { 

     foreach (ListViewItem item in listView.SelectedItems) 
      //do something 

    } 

funziona per me.

1

Ecco come ottenere l'oggetto selezionato e il codice oggetto corrispondente per il doppio elemento listview clic in una lista 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. 
    } 
}  
0

Il mittente è di tipo ListView non ListViewItem.

private void listViewTriggers_MouseDoubleClick(object sender, MouseEventArgs e) 
    { 
     ListView triggerView = sender as ListView; 
     if (triggerView != null) 
     { 
      btnEditTrigger_Click(null, null); 
     } 
    } 
7

Utilizzare il metodo di 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 
     }    
    } 

O il vecchio modo

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); 
    } 
+0

Non vedo e.Location come membro nel MSDN o con il mio compilatore. –

1

È possibile ottenere il ListView prima, e quindi ottenere il ListViewItem selezionati. Ho un esempio per ListBox, ma ListView dovrebbe essere simile.

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; 
    } 
2

io non ho ancora un grande punteggio abbastanza reputazione per aggiungere un commento in cui sarebbe più utile, ma questo è in relazione a coloro che chiedono di una soluzione di 4.5 .Net.

È possibile utilizzare il mouse X e coordinate Y e il metodo ListView getItemAt di trovare la voce che è stato cliccato.

private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    ListViewItem item = myListView.GetItemAt(e.X, e.Y) 
    // Do something here 
} 
0

vedo questo argomento è alto su Google, v'è il mio campione semplice e di lavoro :)

XAML:

<ListView Name="MainTCList" HorizontalAlignment="Stretch" MinHeight="440" Height="Auto" Margin="10,10,5.115,4" VerticalAlignment="Stretch" MinWidth="500" Width="Auto" Grid.Column="0" MouseDoubleClick="MainTCList_MouseDoubleClick" IsSynchronizedWithCurrentItem="True"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Header="UserTID" DisplayMemberBinding="{Binding UserTID}" Width="80"/> 
       <GridViewColumn Header="Title" DisplayMemberBinding="{Binding Title}" Width="410" /> 
      </GridView> 
     </ListView.View> 
    </ListView> 

C#

private void MainTCList_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
      TC item = (TC)MainTCList.Items.CurrentItem; 
      Wyswietlacz.Content = item.UserTID; 
    } 

Wyswietlacz è un test Etichetta per vedere il contenuto dell'elemento :) Aggiungo qui in quest'ultima riga un metodo per caricare la pagina con i dati dell'elemento.

Problemi correlati