Introduction
While surfing through different forums, I noticed that lots of people are actually facing issues while trying to implement the drag and drop feature. The main problem arises while trying to drag from a ListBox to a panel like canvas. In this post, I will go through the steps to demonstrate such a feature.
Here I will use Telerik control to give out the demonstration. You can download the trial version of the DLLs from Telerik Silverlight Control Page. I have implemented the demo using Silverlight 4 Beta 1. The same thing is also possible in the earlier version of Silverlight. You can download Silverlight SDK from Silverlight site. To develop apps in Silverlight 4, you need Visual Studio 2010 Beta 2 which you can download from the Microsoft site.
Use of Code
So, let's go for implementing the same. Create a Silverlight project. Let's create a ListBox and a Canvas inside the LayoutRoot:
<Grid x:Name="LayoutRoot" Background="White">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ListBox x:Name="lstBox" Margin="10" Grid.Column="0"/>
<Canvas x:Name="cnvDropBox" Background="Yellow" Margin="10" Grid.Column="1"/>
</Grid>
Now in the code behind, we have to register the Drag and Drop events for the ListBox & Canvas. Use RadDragAndDropManager class to register the same.
RadDragAndDropManager.AddDragInfoHandler(lstBox, OnDragInfo);
RadDragAndDropManager.AddDragQueryHandler(lstBox, OnDragQuery);
RadDragAndDropManager.AddDropInfoHandler(cnvDropBox, OnDropInfo);
RadDragAndDropManager.AddDropQueryHandler(cnvDropBox, OnDropQuery);
RadDragAndDropManager.SetAllowDrop(cnvDropBox, true);
The implementation of the events will be as below:
private void OnDragQuery(object sender, DragDropQueryEventArgs e)
{
if (e.Options.Status == DragStatus.DragQuery)
{
var draggedListBoxItem = e.Options.Source as Image;
e.Options.DragCue = draggedListBoxItem.Source;
e.Options.Payload = draggedListBoxItem.Source;
}
e.QueryResult = true;
e.Handled = true;
}
private void OnDragInfo(object sender, DragDropEventArgs e)
{
if (e.Options.Status == DragStatus.DragComplete)
{
lstBox.Items.Remove(e.Options.Source);
}
}
private void OnDropInfo(object sender, DragDropEventArgs e)
{
var droppablePanel = e.Options.Destination;
if (e.Options.Status == DragStatus.DropComplete && droppablePanel is Canvas)
{
FrameworkElement dragableControl = null;
Point desiredPosition = new Point();
Point currentDragPoint = e.Options.CurrentDragPoint;
Point canvasPosition = cnvDropBox.TransformToVisual(null).Transform(new Point());
if (e.Options.Source is Image)
{
Image tempDragableControl = e.Options.Source as Image;
dragableControl = new Image() { Source = tempDragableControl.Source };
cnvDropBox.Children.Add(dragableControl);
}
desiredPosition.X = currentDragPoint.X - canvasPosition.X;
desiredPosition.Y = currentDragPoint.Y - canvasPosition.Y;
dragableControl.SetValue(Canvas.LeftProperty, desiredPosition.X);
dragableControl.SetValue(Canvas.TopProperty, desiredPosition.Y);
}
}
private void OnDropQuery(object sender, DragDropQueryEventArgs e)
{
var droppablePanel = e.Options.Destination;
if (e.Options.Status == DragStatus.DropDestinationQuery && droppablePanel is Canvas)
{
e.QueryResult = true;
e.Handled = true;
}
}
As I am using Image inside the ListBoxItem, hence OnDragQuery I am setting the Source as an Image to the DragCue & PayLoad properties. OnDragInfo I am removing item from the ListBox. If you don't want to remove the dragged image from the ListBox, then just remove that line. OnDropInfo I am just placing the Image to the appropriate position which we will get as CurrentDragPoint in the DragDropEventArgs.
This is a sample demonstration. So, you have to explore it more to fulfil your requirement.
CodeProject
Kunal Chowdhury is a Microsoft MVP (Most Valuable Professional) in Silverlight Technology, a Codeproject MVP & Mentor, DZone MVB (Most Valuable Blogger), Speaker in various Microsoft events, Author, passionate Blogger and a Software Engineer by profession.
He is currently working as a Software Engineer II in an MNC located at Pune, India. He has a very good skill over XAML, C#, Silverlight and WPF. He has a good working experience in Windows 7 application (including Multi-touch) development too.
He posts his findings in his technical blog. He also writes for SilverlightShow and Codeproject portal. Many of his articles were highlighted as "Article of the Day" in Microsoft sites.
He also has another website called Silverlight-Zone.com where he posts article links on Silverlight, Windows Phone 7 and XNA accumulated from various web sites to help the community grow on specified technologies.
You can reach him in his Blog : http://www.kunal-chowdhury.com
He is also available in Twitter : http://twitter.com/kunal2383