WPF Drag & Drop, DragOver

I want to drag and drop a button from one Stackpanel to another Stackpanel . The implementation is still working, but I want the button to be attached to the mouse cursor during the drag event as visual feedback.

I searched for a solution all day, but I only found solutions with Canvas , not Stackpanels .

Here is my code:

Button.xaml

  <UserControl x:Class="LisaBeispiel2.Controls.ImageButton" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Name="IB" AllowDrop="True"> <Grid> <Button Margin="3 0 3 3" VerticalAlignment="Top" HorizontalAlignment="Left" IsEnabled="{Binding IsButtonEnabled, ElementName=IB}"> <StackPanel Orientation="Vertical"> <Image Source="{Binding ElementName=IB, Path=Image}" Width="35" Height="35" Margin="8" /> <TextBlock Text="{Binding ElementName=IB, Path=Text}" Foreground="White" FontSize="10" FontFamily="Arial" TextWrapping="Wrap" TextAlignment="Center" /> </StackPanel> </Button> </Grid> 

Button.xaml.cs

 protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); if (e.LeftButton == MouseButtonState.Pressed) { // Package the data into a Dataobject DataObject data = new DataObject(); data.SetData("Object", this); // Inititate the drag-and-drop operation with 3 Parameter: dragSource, data, allowedEffects DragDrop.DoDragDrop(this, data, DragDropEffects.All); } } 

Window.xaml

  <StackPanel Orientation="Horizontal" Drop="panel_Drop"> <controls:ImageButton Image="/LisaBeispiel2;component/Images/Icons/Rotate.png" Text="Rotate"/> <controls:ImageButton Image="/LisaBeispiel2;component/Images/Icons/Zoom_Pan.png" Text="Zoom/Pan"/> </StackPanel> <StackPanel Orientation="Horizontal" Drop="panel_Drop"> <controls:ImageButton Image="/LisaBeispiel2;component/Images/Icons/ButtonPlatzhalter.png" Text="Add"/> <controls:ImageButton Image="/LisaBeispiel2;component/Images/Icons/ButtonPlatzhalter.png" Text="Add"/> </StackPanel> </StackPanel> </StackPanel> 

Window.xaml.cs

  private void panel_Drop(object sender, DragEventArgs e) { // If an element in the panel has already handled the drop, // the panel should not also handle it. if (e.Handled == false) { Panel _panel = (Panel)sender; UIElement _element = (UIElement)e.Data.GetData("Object"); if (_panel != null && _element != null) { // Get the panel that the element currently belongs to, // then remove it from that panel and add it the Children of // the panel that its been dropped on. Panel _parent = (Panel)VisualTreeHelper.GetParent(_element); if (_parent != null) { _parent.Children.Remove(_element); _panel.Children.Add(_element); } } } } 
+5
source share
1 answer
 void StackPanel_DragEnter(object sender, System.Windows.DragEventArgs e) { e.Effects = System.Windows.DragDropEffects.Copy; } 

you can use this event and modify it to work with your drag & drop event.

0
source

Source: https://habr.com/ru/post/1212182/


All Articles