2009-05-30 36 views

回答

34

我正在使用類似的東西只觸發ListViewItem雙擊,而不是例如當你雙擊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

這在.net 4.5中不再適用。 MouseButtonEventArgs沒有(原始)源。 – Harmen 2016-03-15 16:31:17

+1

@Harmen在*** Net 4.5 ***的任何解決方案? – 2016-11-26 09:54:34

+0

這是一個基於ListViewItem的事件的解決方案:https://stackoverflow.com/questions/728205/wpf-listview-attaching-a-double-click-on-an-item-event – Kosau 2017-09-08 15:42:23

0

在ListBox DoubleClick事件中獲取列表框的selecteditem(s)成員,並且您就是在那裏。

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

如果我使用列表框雙擊事件,我可以雙擊列表視圖上的任何地方,如果選擇任何項目,它會得到。我不需要它。只有在雙擊它時,我才需要點擊的項目。 – Sauron 2009-05-30 10:59:10

+0

這是行不通的,因爲你會在滾動條或其他尷尬的地方碰到雙擊 – 2009-06-01 08:52:52

0

要麼使用MouseDoubleClick事件,而且所有MouseClick事件在eventargs變量「e」中都有一個單擊計數。所以如果e.ClickCount == 2,然後雙擊。

0

這很煩人,但要做到這一點的最好辦法是這樣的:

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

然後在代碼:

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> 

唯一的困難則是,如果你對listviewitem映射到的基礎對象感興趣

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

這不適合我在.NET 3.5(VS 2008)上。但是,PreviewMouseDoubleClick的工作。與事件冒泡有關。 – NickV 2013-08-08 18:53:16

+1

這在.net 3.5中對我有用,但是如果你遇到事件冒泡的問題,你可以添加e.Handled = true;以防止它比這個方法更進一步。 – esde84 2014-03-11 13:27:35

1

我在Microsoft開發人員中心找到了此信息。它工作正常,並忽略在錯誤的地方雙擊。正如你所看到的,重點是在觸發雙擊事件之前選擇一個項目。

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

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; 

     } 
    } 
0

在和想打開一個窗口(不同的視圖)與的SelectedItem作爲上下文的列表框類似的問題(對我來說,這樣我就可以對其進行編輯)。

我發現的三個選項是:1.代碼隱藏2.使用附加行爲3.使用Blend的i:使用MVVM-Light的交互和EventToCommand。

我去第三選項,它看起來沿着這些路線的東西:

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

這就是它......當你在你想要的項目雙擊,你在視圖模型方法將被調用與SelectedItem作爲參數,你可以做任何你想要的:)

3

對我來說,我在這段代碼中雙擊ListView。

this.listView.Activation = ItemActivation.TwoClick; 

    this.listView.ItemActivate += ListView1_ItemActivate; 

ItemActivate specify how user activate with items

當用戶做雙擊,ListView1_ItemActivate會觸發。 ListView ItemActivate的屬性是指訪問所選項目的集合。

private void ListView1_ItemActivate(Object sender, EventArgs e) 
    { 

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

    } 

它適用於我。

1

這裏是如何讓所選擇的對象和對象在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

發件人是ListView的類型不是ListViewItem的。

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

使用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 
     }    
    } 

還是老辦法

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); 
    } 
1

你可以先拿到的ListView,然後拿到所選的ListViewItem。 我有一個ListBox的例子,但ListView應該是類似的。

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

我還沒有足夠大的信譽評分添加評論哪裏會是最有幫助,但這是相對於那些問一個.NET 4.5的解決方案。

您可以使用鼠標的X和Y座標以及ListView方法GetItemAt來查找已被點擊的項目。

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

我看到這個題目是高在谷歌,還有就是我的簡單和工作樣本:)

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是一個測試標籤看到項目的內容:)我在這最後一行添加一個方法來加載頁面的數據從項目。

相關問題