WPF Drag and Drop

Drag und Drop ist eine viel verbreitetes Feature. Ich werde versuchen hier einen sehr einfachsten Fall von Drag und Drop aufzuzeigen. Der Fall ist von einer Liste in eine andere Liste ein Item zu verschieben. Für das brauchen wir 2 Events. Das erste Event wäre der PreviewMouseLeftButtonDown, damit wir wissen wann der Benutzer die Maustaste drückt und wir somit das Item nehmen können.
Das zweite Event wäre der Drop, damit wir wissen wann und wo das Item gezogene hinzugefügt werden muss.
Als erstes brauchen wir das Item das gezogen wird. Dazu gibt es diese Hilfsmethode GetObjectDatFromPoint:



private static object GetObjectDataFromPoint(ListBox source, Point point)
{
UIElement element = source.InputHitTest(point) as UIElement;
if (element != null)
{
// get the object from the element
object data = DependencyProperty.UnsetValue;
while (data == DependencyProperty.UnsetValue)
{
// try to get the object value for the corresponding element
data = source.ItemContainerGenerator.ItemFromContainer(element);

// get the parent and we will iterate again
if (data == DependencyProperty.UnsetValue)
{
element = VisualTreeHelper.GetParent(element) as UIElement;
}

// if we reach the actual lustbox then we must break to avoid an infinite loop
if (element == source)
{
return null;
}
}

if (data != DependencyProperty.UnsetValue)
{
return data;
}
}
return null;
}

Diese Hilfsmethode brauchen wir, um das Listboxitem zu erhalten und nicht ein Control innerhalb des Listcontrols.
Das PreviewLeftMouseDown Event sieht wie folgt aus

private void MouseDownHandler(object sender, MouseEventArgs args)
{
ListBox dragSource = (ListBox)sender;
object data = GetObjectDataFromPoint(dragSource, args.GetPosition(dragSource));

if (data != null)
{
DragDrop.DoDragDrop(dragSource, data, DragDropEffects.Move);
}
}

Hier wird Liste von der das Item gezogen wird und das Item das gezogen wird gespeichert und dem DragDrop.DoDragDrop mitgegeben.

Das Drop Event muss wie folgt gehandelt werden

private void DropHandler(object sender, DragEventArgs e)
{
ListBox parent = (ListBox)sender;
object data = e.Data.GetData(typeof(string));

((IList)dragSource.ItemsSource).Remove(data)

parent.Items.Add(data);
}

Hier wird von der Liste von des Item gezogen wurde entfernt und fügt es der Zielliste hinzu.

Und somit hätte man schon einen Funktionierenden Drag and Drop.

Nützliche Links:

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s