it-swarm.com.de

Rufen Sie das Element mit Doppelklick auf die Listenansicht auf

Was muss ich tun, um auf das Doppelklickereignis für ein Listenansicht-Steuerelement zu verweisen?

33
Sauron

Ich verwende so etwas, um nur bei ListViewItem-Doppelklicks auszulösen und nicht zum Beispiel, wenn Sie auf die Kopfzeile der ListView doppelklicken.

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);
    }
}
36
Oskar
<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
        <EventSetter Event="MouseDoubleClick" Handler="listViewItem_MouseDoubleClick" />
    </Style>
</ListView.ItemContainerStyle>

Die einzige Schwierigkeit besteht dann, wenn Sie sich für das zugrunde liegende Objekt interessieren, dem das Listviewitem zugeordnet ist, z.

private void listViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    ListViewItem item = sender as ListViewItem;
    object obj = item.Content;
}
62
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

Verwenden Sie die ListView.HitTest-Methode

    private void listView_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        var senderList  = (ListView) sender;
        var clickedItem = senderList.HitTest(e.Location).Item;
        if (clickedItem != null)
        {
            //do something
        }            
    }

Oder der alte Weg

    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

Das brauchte ich auch. Ich habe das auf msdn gefunden:

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

Ich denke, dieser Abgeordnete ist dafür.

5
AngeDeLaMort

Ich habe noch keine ausreichend hohe Reputationsbewertung, um einen Kommentar hinzuzufügen, wo dies am hilfreichsten wäre, aber dies bezieht sich auf diejenigen, die nach einer .NET 4.5-Lösung fragen.

Sie können die X- und Y-Koordinaten der Maus und die ListView-Methode GetItemAt verwenden, um den angeklickten Eintrag zu finden.

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

für mich doppelklicken Sie auf ListView in diesem Codeabschnitt.

    this.listView.Activation = ItemActivation.TwoClick;

    this.listView.ItemActivate += ListView1_ItemActivate;

ItemActivate angeben, wie Benutzer mit Elementen aktiviert werden sollen

Wenn der Benutzer einen Doppelklick ausführt, wird ListView1_ItemActivate ausgelöst. Die Eigenschaft von ListView ItemActivate bezieht sich auf den Zugriff auf die Sammlung der ausgewählten Elemente.

    private void ListView1_ItemActivate(Object sender, EventArgs e)
    {

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

    }

für mich geht das.

3
CrimsonFantasy

Ich habe dies bei Microsoft Dev Center gefunden. Es funktioniert korrekt und ignoriert das Doppelklicken an falschen Stellen. Wie Sie sehen, besteht der Punkt darin, dass ein Element ausgewählt wird, bevor ein Doppelklickereignis ausgelöst wird.

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

1
Dmitry G.

Sie können zuerst die ListView und dann das Selected ListViewItem abrufen. __ Ich habe ein Beispiel für ListBox, aber ListView sollte ähnlich sein.

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

So erhalten Sie den ausgewählten Objekt- und Objektanpassungscode für das Element mit Doppelklick auf die Listenansicht in einer WPF-Listenansicht:

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

Der Absender ist vom Typ ListView, nicht ListViewItem.

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

Hatte ein ähnliches Problem mit einer ListBox, die ein Fenster (andere Ansicht) mit dem SelectedItem als Kontext öffnen wollte (in meinem Fall kann ich es bearbeiten).

Die drei Optionen, die ich gefunden habe, sind: 1. Hinterliegender Code 2. Verwenden von angefügten Verhaltensweisen 3. Verwenden von Blends i: Interaction und EventToCommand mit MVVM-Light.

Ich bin mit der dritten Option gegangen und es sieht etwas in diese Richtung aus:

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

Das ist es schon ... wenn Sie auf das gewünschte Element doppelklicken, wird Ihre Methode im ViewModel mit dem Parameter SelectedItem as aufgerufen, und Sie können dort alles tun, was Sie wollen :)

0
Noctis

Es ist ärgerlich, aber der beste Weg, es zu tun, ist etwas wie:

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

Dann im Code:

public void HookLVIClicked(object sender, RoutedEventArgs e) {
    var fe = (FrameworkElement)sender;
    var lvi = (ListViewItem)fe.Tag;
    lvi.MouseDoubleClick += MyMouseDoubleClickHandler;
} 
0
Paul Betts

Rufen Sie in der ListBox das DoubleClick-Ereignis ab, und wählen Sie das ausgewählte Element der Listbox aus. Dort befinden Sie sich.

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

Verwenden Sie entweder das MouseDoubleClick-Ereignis, und auch alle MouseClick-Ereignisse haben eine Klickanzahl in der Eventargs-Variablen 'e'. Wenn also e.ClickCount == 2 ist, dann doppelklicken Sie.

0
Joel