Blog
Drag and Drop in WPF mit einer ListBox
In diesem Eintrag zeige ich wie man ein simples Drag and Drop Verfahren mittels zwei ListBoxen realisiert.
Als erstes benötigen wir Daten die per Drag and Drop verschoben werden sollen. Die Daten haben bei mir folgende Struktur.
public class Class
{
public string Artikelname { get; set; }
public string Foto { get; set; }
}
{
public string Artikelname { get; set; }
public string Foto { get; set; }
}
Zum Anzeigen der Daten verwenden wir 2 Listboxen. Ich habe eine ListBox Namens "_ListBoxBucherAngebot". In ihr werden alle vorhandenen Daten angezeigt, sie dient sozusagen als Quelle.
In die zweite ListBox "_ListBoxKaufen" (Ziel ListBox) soll man alle Bücher per Drag and Drop rein ziehen können. Z.B. wäre ein Szenario denkbar, in dem in der Quell-Listbox alle verfügbaren Artikel anzeigt. Der Benutzer zieht von der Quell-ListBox alle Artikel die er kaufen will in die Ziel-ListBox. Bei dieser ListBox müssen wir dem Property AllowDrop den Wert True zuweisen, damit das Drag and Drop aktiviert wird.
<StackPanel Orientation="Horizontal">
<ListBox x:Name="_ListBoxBucherAngebot" HorizontalAlignment="Left" MinHeight="250" ></ListBox>
<ListBox x:Name="_ListBoxKaufen" HorizontalAlignment="Left" MinHeight="250" MinWidth="50" AllowDrop="True"></ListBox>
</StackPanel>
<ListBox x:Name="_ListBoxBucherAngebot" HorizontalAlignment="Left" MinHeight="250" ></ListBox>
<ListBox x:Name="_ListBoxKaufen" HorizontalAlignment="Left" MinHeight="250" MinWidth="50" AllowDrop="True"></ListBox>
</StackPanel>
Als nächstes müssen wir die Quell ListBox mit Daten füllen. Danach abonnieren wir das Event Drop von der _ListBoxKaufen. Damit wir von der Quell-ListBox etwas in die Ziel-ListBox verschieben können, müssen wir den MouseDownEvent mit der Funktion AddHandler zur _ListBoxBucherAngebot hinzufügen.
private void Window1_Loaded(object sender, RoutedEventArgs e)
{
_ListBoxBucherAngebot.ItemsSource = new ObservableCollection<Class>() {
new Class() { Artikelname = "Amazon Buch"} ,
new Class() { Artikelname = "C#"},
new Class() { Artikelname = "Lebenslauf"}};
_ListBoxKaufen.ItemsSource = new ObservableCollection<Class>();
_ListBoxKaufen.Drop += new DragEventHandler(ListBoxKaufen_Drop);
_ListBoxBucherAngebot.AddHandler(ListBox.MouseDownEvent, new MouseButtonEventHandler(ListBox_MouseDown), true);
}
Das Event, welches wir mit der Funktion AddHandler hinzugefügt haben, muss nun ausprogrammiert werden. Im Event holen wir, das SelectedItem und speichern es im DataObject. Mit DoDragDrop starten wir die Drag and Drop Routine.{
_ListBoxBucherAngebot.ItemsSource = new ObservableCollection<Class>() {
new Class() { Artikelname = "Amazon Buch"} ,
new Class() { Artikelname = "C#"},
new Class() { Artikelname = "Lebenslauf"}};
_ListBoxKaufen.ItemsSource = new ObservableCollection<Class>();
_ListBoxKaufen.Drop += new DragEventHandler(ListBoxKaufen_Drop);
_ListBoxBucherAngebot.AddHandler(ListBox.MouseDownEvent, new MouseButtonEventHandler(ListBox_MouseDown), true);
}
private void ListBox_MouseDown(object sender, MouseButtonEventArgs e)
{
Class _class = _ListBoxBucherAngebot.SelectedItem as Class;
if (_class != null)
{
DataObject dataObject = new DataObject(typeof(Class), _class);
DragDrop.DoDragDrop(_ListBoxKaufen, dataObject,DragDropEffects.Scroll);
}
}
{
Class _class = _ListBoxBucherAngebot.SelectedItem as Class;
if (_class != null)
{
DataObject dataObject = new DataObject(typeof(Class), _class);
DragDrop.DoDragDrop(_ListBoxKaufen, dataObject,DragDropEffects.Scroll);
}
}
Zieht der Benutzer von der Quelle ein Element in die Ziel ListBox und lässt es dorf "dropen" wird das Drop Event ausgelöst.
Über das DragEventArgs Objekt holen wir das Element, welches verschoben wurde. Als nächstes fügen wir es der Ziel ListBox hinzu. Das machen wir über die ItemSource da sonst eine Exception (Der Vorgang ist während der Verwendung von "ItemsSource" ungültig. Verwenden Sie stattdessen "ItemsControl.ItemsSource", um auf Elemente zuzugreifen und diese zu ändern.) ausgelöst wird.
private void ListBoxKaufen_Drop(object sender, DragEventArgs e)
{
Class _class = (Class)e.Data.GetData(typeof(Class));
if (_class != null)
{
ListBox listBox = e.Source as ListBox;
//Der Vorgang ist während der Verwendung von "ItemsSource" ungültig.
//Verwenden Sie stattdessen "ItemsControl.ItemsSource", um auf Elemente zuzugreifen und diese zu Ändern.
//listBox.Items.Add(_class);
(listBox.ItemsSource as ObservableCollection<Class>).Add(_class);
}
}
{
Class _class = (Class)e.Data.GetData(typeof(Class));
if (_class != null)
{
ListBox listBox = e.Source as ListBox;
//Der Vorgang ist während der Verwendung von "ItemsSource" ungültig.
//Verwenden Sie stattdessen "ItemsControl.ItemsSource", um auf Elemente zuzugreifen und diese zu Ändern.
//listBox.Items.Add(_class);
(listBox.ItemsSource as ObservableCollection<Class>).Add(_class);
}
}
Mit diesem Code kann man von der Quell-ListBox beliebig viele Elemente in die Ziel-ListBox per Drag and Drop verschieben.
Schlüsselwörter: C#, WPF
zuletzt geändert: 31. Mai 2009 19:26
Link zu diesem Artikel: (in die Zwischenablage)
(c) 2011 | Impressum |
| Empfehlenswerte Blog Einträgebaska.jpg)