¿Cómo puedo arrastrar y soltar un archivo en otra aplicación (igual que si lo estuviera arrastrando desde el explorador de archivos)?

programación


Hola,
Quiero replicar el proceso de arrastrar y soltar desde el explorador de archivos pero desde mi aplicación, que será el elemento lislview.

es decir
Arrastre el elemento de la vista de lista (ruta del archivo) a otra aplicación de la misma manera que funcionaría el explorador.

Parece que hay muchos ejemplos que se arrastran a una aplicación, pero muy pocos a otra.

gracias de antemano

Lo que he probado:

He probado esto con el mouse hacia abajo pero no es el enfoque correcto.

DataObject Data = New DataObject(DataFormats.FileDrop, files)
DragDrop.DoDragDrop(listTest, Data, DragDropEffects.Copy)

Incluso he pensado en utilizar el portapapeles, pero nuevamente no creo que sea el enfoque correcto.

Ordenado (Solo si alguien más tiene dificultades.

<ListView x:Name="Lst_File_Viewer" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Margin="5,3,5,3" SelectionMode="Single">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            <EventSetter Event="MouseMove"  Handler="Lst_File_Viewer_MouseMove" />
        </Style>
        
    </ListView.ItemContainerStyle>

    <ListView.View>
        <GridView AllowsColumnReorder="False">
            <GridViewColumn Header="File Name" Width="Auto" DisplayMemberBinding="{Binding Name}" />
            <GridViewColumn Header="Dir" Width="0" DisplayMemberBinding="{Binding Directory}" />
        </GridView>
    </ListView.View>
</ListView>
Private Sub Lst_File_Viewer_MouseMove(sender As Object, e As MouseEventArgs)
    If e.LeftButton = MouseButtonState.Pressed Then

        If e.Source IsNot Nothing Then
            Dim dataObject As DataObject ' = New DataObject(myList)
            Dim myList As StringCollection = New StringCollection
            For Each Item As File In Lst_File_Viewer.SelectedItems
                myList.Add(Item.Directory)


            Next


            dataObject = New DataObject()
            dataObject.SetFileDropList(myList)

            DragDrop.DoDragDrop(Lst_File_Viewer, dataObject, DragDropEffects.Copy)
        End If
    End If
End Sub

Gracias por guiarme por el camino correcto.

Solución 1

Cuando arrastras y sueltas desde el explorador a una aplicación, el receptor necesita hacer un par de cosas:
1) Manejar el evento DragEnter Establezca e.Effect en DragDropEffect.Copy o DragDropEffects.Move
2) Maneje el evento DragDrop y obtenga la lista de archivos llamando a e.Data.GetData y pasándole el valor DataFormts.FileDrop. Esto devuelve un Objeto que, si hay archivos, será una matriz de cadenas: una cadena por archivo y que contiene la ruta completa al archivo.

Entonces, arrastrar fuera de su aplicación en un formato que el otro sistema pueda procesar es bastante simple: cree una matriz de rutas y llame al método DoDragDrop para su formulario (u otro control) pasando la matriz y DragDropEffects.Copy Ored con DragDropEffects.Move as el segundo parámetro.

Quizás también quieras mirar el Evento Control.QueryContinueDrag (System.Windows.Forms) | Microsoft aprende[^] pero si opta por “cualquier aplicación”, entonces no debería necesitarla.

コメント

タイトルとURLをコピーしました