Как получить перетаскиваемый элемент в приложении Silverlight - PullRequest
1 голос
/ 02 марта 2010

У меня есть два ListBox (в приложении Silverlight 3), каждый из которых обернут в ListBoxDragDropTarget. Теперь я заполняю SourceBox некоторыми пользовательскими объектами (Person). Затем я подключаю событие DragOver к назначению DragDtopTarget. Все это работает нормально, и я могу перетаскивать элементы из первого списка во второй.

Теперь моя проблема: как я могу получить Элемент, который перетаскивается, чтобы разрешить / запретить перетаскивание? (Я не могу получить человека из FragEventArgs).

Это мой Xaml:

<Grid x:Name="LayoutRoot" Background="White">
<Grid.ColumnDefinitions>
    <ColumnDefinition Width="*"/>
    <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>

<controlsToolkit:ListBoxDragDropTarget 
    HorizontalContentAlignment="Stretch" 
    VerticalContentAlignment="Stretch"
    x:Name="DragSource">
    <ListBox x:Name="lbSource" DisplayMemberPath="Name" />
</controlsToolkit:ListBoxDragDropTarget>

<controlsToolkit:ListBoxDragDropTarget 
    Grid.Column="1" 
    HorizontalContentAlignment="Stretch" 
    VerticalContentAlignment="Stretch"
    x:Name="DragDest"
    msWindows:DragDrop.AllowDrop="true">
    <ListBox x:Name="lbDest" DisplayMemberPath="Name" />
</controlsToolkit:ListBoxDragDropTarget>

и это код моего обработчика DragOver:

Private Sub DragDest_DragOver(ByVal sender As Object, _
   ByVal e As Microsoft.Windows.DragEventArgs) _
   Handles DragDest.DragOver

    Dim Pers = e.Data.GetData(GetType(Person))

End Sub

Спасибо за любые подсказки, как решить эту проблему.

Christoph

EDIT:

Это моя короткая версия Ответа :-):

Private Sub DragDest_DragOver(ByVal sender As Object, _
     ByVal e As Microsoft.Windows.DragEventArgs) _
     Handles DragDest.DragOver

    Dim Args As ItemDragEventArgs = e.Data.GetData(e.Data.GetFormats()(0))

    Dim Sel As SelectionCollection = Args.Data

    Dim Persons = (From Pe In Sel Select DirectCast(Pe.Item, Person)).ToList

End Sub

1 Ответ

2 голосов
/ 03 марта 2010

Сначала необходимо преобразовать объект данных в ItemDragEventArgs, а затем извлечь из него коллекцию SelectionCollection, которая содержит перетаскиваемый элемент. Передайте параметр e этому методу, и он вернет вам перетаскиваемые элементы.

Я использовал онлайновый конвертер C # в VB, так что, надеюсь, он проделал достаточно хорошую работу. Оба VB и C # ниже.

VB:

    using System.Windows.Controls;
    using System.Linq;
    using System.Collections.ObjectModel;
    using System.Collections.Generic;
#if SILVERLIGHT
    using SW = Microsoft.Windows;
#else
    using SW = System.Windows;
#endif

        Private Function GetSelectedPeople(ByVal args As SW.DragEventArgs) As IEnumerable(Of Person)
            Dim people As IEnumerable(Of Person) = Nothing
            
            ' Retrieve the dropped data in the first available format.
            Dim data As Object = args.Data.GetData(args.Data.GetFormats()(0))
            
            ' The data is the ItemDragEventArgs that was created by the DDT when
            ' the drag started.  It contains a SelectionCollection.
            ' SelectionCollection's are used by DDTs because they can transfer 
            ' multiple objects.  The fact that they store the indexes of the 
            ' objects within the source collection also makes reordering items
            ' within a source possible.
            Dim dragEventArgs As ItemDragEventArgs = TryCast(data, ItemDragEventArgs)
            Dim selectionCollection As SelectionCollection = TryCast(dragEventArgs.Data, SelectionCollection)
            If selectionCollection IsNot Nothing Then
                people = selectionCollection.[Select](Function(selection) selection.Item).OfType(Of Person)()
            End If
            
            Return people
        End Function

C #:

    using System.Windows.Controls;
    using System.Linq;
    using System.Collections.ObjectModel;
    using System.Collections.Generic;
#if SILVERLIGHT
    using SW = Microsoft.Windows;
#else
    using SW = System.Windows;
#endif

private IEnumerable<Person> GetSelectedPeople(SW.DragEventArgs args)
{
    IEnumerable<Person> people = null;

    // Retrieve the dropped data in the first available format.
    object data = args.Data.GetData(args.Data.GetFormats()[0]);

    // The data is the ItemDragEventArgs that was created by the DDT when
    // the drag started.  It contains a SelectionCollection.
    // SelectionCollection's are used by DDTs because they can transfer 
    // multiple objects.  The fact that they store the indexes of the 
    // objects within the source collection also makes reordering items
    // within a source possible.
    ItemDragEventArgs dragEventArgs = data as ItemDragEventArgs;
    SelectionCollection selectionCollection = dragEventArgs.Data as SelectionCollection;
    if (selectionCollection != null)
    {
        people = selectionCollection.Select(selection => selection.Item).OfType<Person>();
    }

    return people;
}

Ссылка: http://themechanicalbride.blogspot.com/2009/10/silverlight-drag-drop-support-part-2.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...