Readdy Write  
0,00 €
Your View Money
Views: Count
Self 20% 0
Your Content 60% 0

Users by Links 0
u1*(Content+Views) 10% 0
Follow-Follower 0
s2*(Income) 5% 0

Count
Followers 0
Login Register as User

WPF: Drag Drop Beispiel

12.01.2019 (👁13012)


 

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 = (ColorColorConverter.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 = (ColorColorConverter.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 >-