web-dev-qa-db-ja.com

リストビューのアイテムダブルクリックイベントを取得します

リストビューコントロールのダブルクリックイベントを参照するには、何をする必要がありますか?

37
Sauron

このようなものを使用して、たとえばListViewのヘッダーをダブルクリックしたときではなく、ListViewItemのダブルクリックでのみトリガーします。

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);
    }
}
37
Oskar
<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;
}
63
Oliver
    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;

        }
    }
8
JasonEdinburgh

使用 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);
    }
7
Guish

私もそれが必要でした。私はmsdnでそれを見つけました:

http://msdn.Microsoft.com/en-us/library/system.windows.forms.listview.activation.aspx

このデリゲートはそのためだと思います。

5
AngeDeLaMort

コメントを追加するのに最も役立つ評判スコアはまだありませんが、これは.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
}

私にとっては、このコードセクションでListViewをダブルクリックします。

    this.listView.Activation = ItemActivation.TwoClick;

    this.listView.ItemActivate += ListView1_ItemActivate;

ItemActivateは、ユーザーがアイテムでアクティブ化する方法を指定します

ユーザーがダブルクリックすると、ListView1_ItemActivateがトリガーされます。 ListView ItemActivateのプロパティは、選択されたアイテムのコレクションにアクセスすることを指します。

    private void ListView1_ItemActivate(Object sender, EventArgs e)
    {

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

    }

わたしにはできる。

3
CrimsonFantasy

これはMicrosoft Dev Centerで見つけました。正しく動作し、間違った場所でのダブルクリックを無視します。ご覧のとおり、ポイントは、ダブルクリックイベントがトリガーされる前にアイテムが選択されることです。

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

1
Dmitry G.

最初にListViewを取得してから、Selected 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;
    }
1
kzhou

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.
    }
}       
1
Marcel Pennock

送信者のタイプはListViewItemではなくListViewです。

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

ListBoxが、SelectedItemをコンテキストとしてウィンドウ(異なるビュー)を開きたいという、同様の問題を抱えていました(私の場合、編集できます)。

私が見つけた3つのオプションは次のとおりです。1.コードビハインド2.アタッチされた動作の使用3. MVVM-Lightを使用したBlendのi:InteractionおよびEventToCommandの使用。

私は3番目のオプションを使用しましたが、これらの線に沿って何かが見えます:

<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をパラメーターとしてViewModelのメソッドが呼び出され、そこで何でもできます:)

0
Noctis

迷惑ですが、それを行うための最良の方法は次のようなものです:

<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;
} 
0
Ana Betts

ListBox DoubleClickイベントで、listboxのselecteditem(s)メンバーを取得します。

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

MouseDoubleClickイベントを使用するか、すべてのMouseClickイベントのeventargs変数「e」にクリック数が含まれます。 e.ClickCount == 2の場合、ダブルクリックします。

0
Joel