== Drag and Drop ==
== Source Control (Drag Origin) ==
Sample ListBox (XAML) where Drag originates:
Normal
Restaurant/Party
Telephone
Music
Code behind:
private void lstEnvironments_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
string myDragData = ((ListBoxItem)lstEnvironments.SelectedItem).Content.ToString();
lblSelectedEnvironment.Text = string.Format("{0}", myDragData); // selected data
}
private void lstEnvironments_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
// Store the mouse position
startPoint = e.GetPosition(null);
}
private void lstEnvironments_MouseMove(object sender, MouseEventArgs e)
{
// Get the current mouse position
Point mousePos = e.GetPosition(null);
Vector diff = startPoint - mousePos;
if (e.LeftButton == MouseButtonState.Pressed &&
Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance &&
Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)
{
// Get the dragged ListBoxItem
ListBox lstBox = sender as ListBox;
ListBoxItem lstBoxItem = FindAnchestor((DependencyObject)e.OriginalSource);
// Find the data behind the ListBoxItem
//string str = (string)lstBox.ItemContainerGenerator.ItemFromContainer(lstBoxItem);
string str = ((ListBoxItem)lstBox.SelectedItem).Content.ToString();
// Initialize the drag & drop operation
DataObject dragData = new DataObject(typeof(string), str);
DragDrop.DoDragDrop(lstBoxItem, dragData, DragDropEffects.Move);
}
}
// Helper to search up the VisualTree
private static T FindAnchestor(DependencyObject current)
where T : DependencyObject
{
do
{
if (current is T)
{
return (T)current;
}
current = VisualTreeHelper.GetParent(current);
}
while (current != null);
return null;
}
== Target Control (Drop Target) ==
Target controls where Drop is performed. In this case, a ''ListBox'', ''TextBlock'', and ''TextBox''.
Dragged Items
ListBox:
TextBlock:
Value
Code behind:
private void lstAppliedEnvironment_DragEnter(object sender, DragEventArgs e)
{
if (!e.Data.GetDataPresent("str") || sender == e.Source)
{
e.Effects = DragDropEffects.None;
}
}
private void lstAppliedEnvironment_Drop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(string)))
{
string str = e.Data.GetData(typeof(string)) as string;
ListBox lstBox = sender as ListBox;
lstBox.Items.Add(str);
}
}
private void lblAppliedEnvironment_DragEnter(object sender, DragEventArgs e)
{
if (!e.Data.GetDataPresent("str") || sender == e.Source)
{
e.Effects = DragDropEffects.None;
}
}
private void lblAppliedEnvironment_Drop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(string)))
{
string str = e.Data.GetData(typeof(string)) as string;
TextBlock lbl = sender as TextBlock;
lbl.Text = str;
}
}
== Resources ==
* [[http://blog.nostatic.org/2007/12/drag-and-drop-in-wpf.html|Drag and Drop in WPF]]
* [[http://blogs.msdn.com/b/jaimer/archive/2007/07/12/drag-drop-in-wpf-explained-end-to-end.aspx|Drag and Drop in WPF Explained End to End]] (Jaime RodrÃguez)
* [[http://msdn.microsoft.com/en-us/library/ms742859.aspx|MSDN: Drag and Drop Overview]]
* [[http://wpftutorial.net/DragAndDrop.html|WPF Tutorial: Drag and Drop]]
* [[http://www.switchonthecode.com/tutorials/winforms-using-custom-cursors-with-drag-drop|WinForms using custom cursors with Drag and Drop]]
* [[http://www.codeproject.com/KB/WPF/DraggingElementsInCanvas.aspx|Dragging Elements in Canvas]]