Das folgende C# Code Beispiel zeigt die einfache Erstellung eines Drag und Drop Funktion in WPF
Im diesem Beispiel wird ein rechteckiges Planungs-Feld (WPF Button) in ein Planungskalender gezogen (WPF Border).
Mit einem WPF Drag-und-Drop Vorgang können beliebige Daten zur Laufzeit übertragen werden.
Beim Erstellen eines Drag-Vorgangs werden beim Beginn alle frei definierbaren Informationen in ein DragObject gelegt.
Diese frei definierten Informationen können dann beim Ziel wie bei einem Array vom Drag-Object herausgelesen werden.
Programmierung Drag_Drop:
Drag-Element
Das WPF-Button Element, welches gezogen werden soll, benötigt ein einen .PreviewMouseLeftButtonDown Event
Dieser kann in Xaml als Event hinzugefügt werden oder wie hier zur Laufzeit wie hier an eine Event-Methode Start_Drag_Event.
btnMitarbeiter_Schicht.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(Start_Drag_Event);
|
Drag-Ziel
Das Element, welches auf ein Drag-Vorgang regieren soll benötigt dann die Eigenschaft .AllowDrop=true und den .Drop event
cellBorder.AllowDrop = true; cellBorder.Drop += new DragEventHandler(Target_Border_Drop);
|
Beim Start des Drag-Vorgangs wird dann ein DragObject erstellt und dieses Object wird dann mit allen möglichen Daten beladen
//< set_dragData > //*set informations to the dragged object DataObject dataObj = new DataObject(); dataObj.SetData("Name", sName); dataObj.SetData("Farbe", sColor); dataObj.SetData("IDMitarbeiter", IDMitarbeiter); //</ set_dragData >
//< start_drag > //*shows drag moving icon until drops DragDrop.DoDragDrop(button, dataObj, DragDropEffects.Move); //</ start_drag >
|
Drop-Event:
Beim Drop-Event wird dann direkt das DragObject ausgelesen
//< values_from_dragger > String sColor = (String)e.Data.GetData("Farbe"); Color color = (Color) ColorConverter.ConvertFromString(sColor); String sName = (String)e.Data.GetData("Name"); int IDMitarbeiter = (int) e.Data.GetData("IDMitarbeiter"); //</ values_from_dragger >
|
C# Code Drag und Drop
#region Drag_Drop //=============< region: Drag_Drop >============= private void Start_Drag_Event(object sender, MouseButtonEventArgs e) { //---------------------< Start_Drag_Event() >--------------------- //< init > //*get values from drag_button_start Button button = (Button)sender; string sName = (string) button.Content; string sColor = button.Background.ToString(); string sControlname = button.Name; int IDMitarbeiter = clsStrings.get_Key_Value_from_String_as_Integer(sControlname, "IDMitarbeiter"); //</ init >
//< set_dragData > //*set informations to the dragged object DataObject dataObj = new DataObject(); dataObj.SetData("Name", sName); dataObj.SetData("Farbe", sColor); dataObj.SetData("IDMitarbeiter", IDMitarbeiter); //</ set_dragData >
//< start_drag > //*shows drag moving icon until drops DragDrop.DoDragDrop(button, dataObj, DragDropEffects.Move); //</ start_drag >
//---------------------</ Start_Drag_Event() >--------------------- }
private void Target_Border_Drop(object sender, DragEventArgs e) { //---------------------< Target_Border_Drop() >--------------------- //*event when drop on target control Border target_Control = (Border)sender;
//< values_from_dragger > String sColor = (String)e.Data.GetData("Farbe"); Color color = (Color) ColorConverter.ConvertFromString(sColor); String sName = (String)e.Data.GetData("Name"); int IDMitarbeiter = (int) e.Data.GetData("IDMitarbeiter"); //</ values_from_dragger >
//--< save_as_DatePlan_Entry >-- string sPanelName = target_Control.Name; int IDMaschine = clsStrings.get_Key_Value_from_String_as_Integer(sPanelName , "IDMaschine"); int IDSchicht = clsStrings.get_Key_Value_from_String_as_Integer(sPanelName, "IDSchicht"); int PosNrBesetzung = clsStrings.get_Key_Value_from_String_as_Integer(sPanelName, "PosNrBesetzung"); DateTime DatePlan = clsStrings.get_Key_Value_from_String_as_Date(sPanelName, "DatePlan");
//< save > //eintrag in die Datenbank clsSchichtplan.erstelle_Schichtplan_Eintrag(IDMaschine, IDSchicht, IDMitarbeiter, DatePlan, PosNrBesetzung); //</ save > //--</ save_as_DatePlan_Entry >--
//< show_Button > //*insert child_button with name Button child_Button = new Button(); child_Button.Background = new SolidColorBrush(color); child_Button.Content = sName; child_Button.Name = ""; target_Control.Child = child_Button; //</ show_Button > //---------------------</ Target_Border_Drop() >--------------------- }
//=============</ region: Drag_Drop >============= #endregion /Drag_Drop
|
Zur Vollständigkeit des Beispiels:
Drag-Quelle
Hier der Code zum erstellen eines Buttons während der Laufzeit.
//--< cellButton_Mitarbeiter_erstellen >--
Button btnMitarbeiter_Schicht = new Button(); btnMitarbeiter_Schicht.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString(sColor_SchichtGruppe)); btnMitarbeiter_Schicht.Content = mitarbeiter.Nachname; btnMitarbeiter_Schicht.Name = "button_IDMitarbeiter_" + mitarbeiter.IDMitarbeiter; btnMitarbeiter_Schicht.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(Start_Drag_Event);
Set_Position_of_Element_in_a_Grid(btnMitarbeiter_Schicht, rowNr, iColNr); Grid_Mitarbeiter.Children.Add(btnMitarbeiter_Schicht); //--</ cellButton_Mitarbeiter_erstellen >--
|
Drag-Empfänger
//-< panel >- Border cellBorder = new Border(); Color color = (Color)ColorConverter.ConvertFromString(_sColor_Cell); cellBorder.Background = new SolidColorBrush(color); cellBorder.Margin = new Thickness(1); cellBorder.MouseUp += Panel_MouseUp;
cellBorder.AllowDrop = true; cellBorder.Drop += new DragEventHandler(Target_Border_Drop); //--< Cell_name >-- string sCellBorder_Name = "cellBorder_IDMaschine_" + maschine.IDMaschine + "_IDSchicht_" + IDSchicht + "_PosNrMitarbeiter_" + iMitarbeiter + "_DatePlan_" + sDatePlan; cellBorder.Name = sCellBorder_Name;
//--</ Cell_name >-- Set_Position_of_Element_in_a_Grid(cellBorder, rowNr, iColNr); Grid_Plan.Children.Add(cellBorder); //-</ panel >-
|