ListView.InsertionMark Propriedade

Definição

Obtém um objeto usado para indicar a localização esperada para soltar quando um item é arrastado em um controle ListView.

[System.ComponentModel.Browsable(false)]
public System.Windows.Forms.ListViewInsertionMark InsertionMark { get; }

Valor da propriedade

Um objeto ListViewInsertionMark que representa a marca de inserção.

Atributos

Exemplos

O exemplo de código a seguir demonstra como usar o ListView recurso de marca de inserção. Este exemplo implementa a reordenação de item de arrastar e soltar usando os eventos de arrastar padrão. A posição da marca de inserção é atualizada em um manipulador para o Control.DragOver evento. Nesse manipulador, a posição do ponteiro do mouse é comparada ao ponto médio do item mais próximo e o resultado é usado para determinar se a marca de inserção aparece à esquerda ou à direita do item.

using System;
using System.Drawing;
using System.Windows.Forms;

public class ListViewInsertionMarkExample : Form
{
    private ListView myListView; 

    public ListViewInsertionMarkExample()
    {
        // Initialize myListView.
        myListView = new ListView();
        myListView.Dock = DockStyle.Fill;
        myListView.View = View.LargeIcon;
        myListView.MultiSelect = false;
        myListView.ListViewItemSorter = new ListViewIndexComparer();

        // Initialize the insertion mark.
        myListView.InsertionMark.Color = Color.Green;

        // Add items to myListView.
        myListView.Items.Add("zero");
        myListView.Items.Add("one");
        myListView.Items.Add("two");
        myListView.Items.Add("three");
        myListView.Items.Add("four");
        myListView.Items.Add("five");
        
        // Initialize the drag-and-drop operation when running
        // under Windows XP or a later operating system.
        if (OSFeature.Feature.IsPresent(OSFeature.Themes))
        {
            myListView.AllowDrop = true;
            myListView.ItemDrag += new ItemDragEventHandler(myListView_ItemDrag);
            myListView.DragEnter += new DragEventHandler(myListView_DragEnter);
            myListView.DragOver += new DragEventHandler(myListView_DragOver);
            myListView.DragLeave += new EventHandler(myListView_DragLeave);
            myListView.DragDrop += new DragEventHandler(myListView_DragDrop);
        }

        // Initialize the form.
        this.Text = "ListView Insertion Mark Example";
        this.Controls.Add(myListView);
    }

    [STAThread]
    static void Main() 
    {
        Application.EnableVisualStyles();
        Application.Run(new ListViewInsertionMarkExample());
    }

    // Starts the drag-and-drop operation when an item is dragged.
    private void myListView_ItemDrag(object sender, ItemDragEventArgs e)
    {
        myListView.DoDragDrop(e.Item, DragDropEffects.Move);
    }

    // Sets the target drop effect.
    private void myListView_DragEnter(object sender, DragEventArgs e)
    {
        e.Effect = e.AllowedEffect;
    }

    // Moves the insertion mark as the item is dragged.
    private void myListView_DragOver(object sender, DragEventArgs e)
    {
        // Retrieve the client coordinates of the mouse pointer.
        Point targetPoint = 
            myListView.PointToClient(new Point(e.X, e.Y));

        // Retrieve the index of the item closest to the mouse pointer.
        int targetIndex = myListView.InsertionMark.NearestIndex(targetPoint);

        // Confirm that the mouse pointer is not over the dragged item.
        if (targetIndex > -1) 
        {
            // Determine whether the mouse pointer is to the left or
            // the right of the midpoint of the closest item and set
            // the InsertionMark.AppearsAfterItem property accordingly.
            Rectangle itemBounds = myListView.GetItemRect(targetIndex);
            if ( targetPoint.X > itemBounds.Left + (itemBounds.Width / 2) )
            {
                myListView.InsertionMark.AppearsAfterItem = true;
            }
            else
            {
                myListView.InsertionMark.AppearsAfterItem = false;
            }
        }

        // Set the location of the insertion mark. If the mouse is
        // over the dragged item, the targetIndex value is -1 and
        // the insertion mark disappears.
        myListView.InsertionMark.Index = targetIndex;
    }

    // Removes the insertion mark when the mouse leaves the control.
    private void myListView_DragLeave(object sender, EventArgs e)
    {
        myListView.InsertionMark.Index = -1;
    }

    // Moves the item to the location of the insertion mark.
    private void myListView_DragDrop(object sender, DragEventArgs e)
    {
        // Retrieve the index of the insertion mark;
        int targetIndex = myListView.InsertionMark.Index;

        // If the insertion mark is not visible, exit the method.
        if (targetIndex == -1) 
        {
            return;
        }

        // If the insertion mark is to the right of the item with
        // the corresponding index, increment the target index.
        if (myListView.InsertionMark.AppearsAfterItem) 
        {
            targetIndex++;
        }

        // Retrieve the dragged item.
        ListViewItem draggedItem = 
            (ListViewItem)e.Data.GetData(typeof(ListViewItem));

        // Insert a copy of the dragged item at the target index.
        // A copy must be inserted before the original item is removed
        // to preserve item index values. 
        myListView.Items.Insert(
            targetIndex, (ListViewItem)draggedItem.Clone());

        // Remove the original copy of the dragged item.
        myListView.Items.Remove(draggedItem);
    }

    // Sorts ListViewItem objects by index.
    private class ListViewIndexComparer : System.Collections.IComparer
    {
        public int Compare(object x, object y)
        {
            return ((ListViewItem)x).Index - ((ListViewItem)y).Index;
        }
    }
}

Comentários

O ListView recurso de marca de inserção permite que você indique visualmente o local de descarte esperado em uma operação de arrastar e soltar quando um item é arrastado para uma nova posição. Esse recurso funciona somente quando a AutoArrange propriedade é definida true como e quando o ListView controle não classifica os itens automaticamente. Para evitar a classificação automática, a Sorting propriedade deve ser definida como SortOrder.None e a View propriedade deve ser definida como View.LargeIcon, View.SmallIconou View.Tile. Além disso, o recurso de marca de inserção pode não estar visível com o ListView recurso de agrupamento porque o recurso de agrupamento ordena os itens por associação de grupo.

Normalmente ListViewInsertionMark , a classe é usada em um manipulador para o Control.DragOver evento ou Control.MouseMove para atualizar a posição da marca de inserção à medida que um item é arrastado. Ele também é usado em um manipulador para o Control.DragDrop evento ou Control.MouseUp para inserir um item arrastado no local correto. Para obter mais informações, consulte ListViewInsertionMark e Como exibir uma marca de inserção em um controle ListView Windows Forms.

Nota

O recurso de marca de inserção só está disponível no Windows XP e no Windows Server 2003 quando seu aplicativo chama o Application.EnableVisualStyles método . Em sistemas operacionais anteriores, qualquer código relacionado à marca de inserção não tem efeito e a marca de inserção não será exibida. Como resultado, qualquer código que dependa do recurso de marca de inserção pode não funcionar corretamente. Talvez você queira incluir um código que determine se esse recurso está disponível e fornecer funcionalidade alternativa quando ele não estiver disponível. Por exemplo, talvez você queira ignorar todo o código que implementa o reposicionamento de item de arrastar e soltar ao executar em sistemas operacionais que não dão suporte a marcas de inserção.

O recurso de marca de inserção é fornecido pela mesma biblioteca que fornece o recurso de temas do sistema operacional. Para marcar a disponibilidade dessa biblioteca, chame a sobrecarga do FeatureSupport.IsPresent(Object) método e passe o OSFeature.Themes valor.

Aplica-se a

Produto Versões
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
Windows Desktop 3.0, 3.1, 5, 6, 7, 8, 9

Confira também