Silverlight – Two ways of Drag-n-Drop

There are two way of dragging and dropping objects in Silverlight. One way is by changing canvas left – top property and second is by changing translate-transform. Both codes are here.

By changing Canvas Left – Top property

XAML –

<UserControl x:Class=”draggingObjects.Page”

    xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation&#8221;

    xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml&#8221;

    Width=”Auto” Height=”Auto” xmlns:d=”http://schemas.microsoft.com/expression/blend/2008&#8243; xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006&#8243; mc:Ignorable=”d” HorizontalAlignment=”Left” VerticalAlignment=”Top”>

    <Grid x:Name=”LayoutRoot” Background=”White”>

      <Canvas Margin=”0,0,-100,-100″>

            <Rectangle Height=”100″ Fill=”#FFFF7575″ Stroke=”#FF000000″ Width=”100″ x:Name=”rectDraggable” MouseLeftButtonDown=”rectDraggable_MouseDown” MouseLeftButtonUp=”rectDraggable_MouseUp” MouseMove=”rectDraggable_MouseMove” RenderTransformOrigin=”0.5,0.5″ />

         

      </Canvas>

    </Grid>

</UserControl>

 

C#

namespace draggingObjects

{

    public partial class Page : UserControl

    {

        private Point clickPostion;

        private bool isMouseCaptured;

        public Page()

        {

            InitializeComponent();

        }

 

        private void rectDraggable_MouseDown(object sender, MouseButtonEventArgs e)

        {

            clickPostion = e.GetPosition(sender as UIElement);

            rectDraggable.CaptureMouse();

            isMouseCaptured = true;

        }

 

        private void rectDraggable_MouseUp(object sender, MouseButtonEventArgs e)

        {

            rectDraggable.ReleaseMouseCapture();

            isMouseCaptured = false;

        }

 

        private void rectDraggable_MouseMove(object sender, MouseEventArgs e)

        {

            if (isMouseCaptured)

            {

                double diffX = e.GetPosition(this).X – clickPostion.X;

                double diffY = e.GetPosition(this).Y – clickPostion.Y;

                rectDraggable.SetValue(Canvas.LeftProperty, diffX);

                rectDraggable.SetValue(Canvas.TopProperty,diffY);

               

            }

        }

    }

}

 

By Changing Translate-Transformation

XAML-

<UserControl x:Class=”draggingObjects.Page”

    xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation&#8221;

    xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml&#8221;

    Width=”Auto” Height=”Auto” xmlns:d=”http://schemas.microsoft.com/expression/blend/2008&#8243; xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006&#8243; mc:Ignorable=”d” HorizontalAlignment=”Left” VerticalAlignment=”Top”>

    <Grid x:Name=”LayoutRoot” Background=”White”>

        <Rectangle Height=”100″ Fill=”#FFFF7575″ Stroke=”#FF000000″ Width=”100″ x:Name=”rectDraggable” MouseLeftButtonDown=”rectDraggable_MouseDown” MouseLeftButtonUp=”rectDraggable_MouseUp” MouseMove=”rectDraggable_MouseMove” RenderTransformOrigin=”0.5,0.5″>

                <Rectangle.RenderTransform>

                    <TransformGroup>

                        <ScaleTransform/>

                        <SkewTransform/>

                        <RotateTransform/>

                        <TranslateTransform x:Name=”recttranslateTransform”/>

                    </TransformGroup>

                </Rectangle.RenderTransform>

            </Rectangle>

    </Grid>

</UserControl>

 

C# –

namespace draggingObjects

{

    public partial class Page : UserControl

    {

        private Point clickPostion;

        private bool isMouseCaptured;

        public Page()

        {

            InitializeComponent();

        }

 

        private void rectDraggable_MouseDown(object sender, MouseButtonEventArgs e)

        {

            clickPostion = e.GetPosition(sender as UIElement);

            rectDraggable.CaptureMouse();

            isMouseCaptured = true;

        }

 

        private void rectDraggable_MouseUp(object sender, MouseButtonEventArgs e)

        {

            rectDraggable.ReleaseMouseCapture();

            isMouseCaptured = false;

        }

 

        private void rectDraggable_MouseMove(object sender, MouseEventArgs e)

        {

            if (isMouseCaptured)

            {

                double diffX = e.GetPosition(this).X – clickPostion.X;

                double diffY = e.GetPosition(this).Y – clickPostion.Y;

                recttranslateTransform.X = diffX;

                recttranslateTransform.Y = diffY;

              

            }

        }

    }

}

 

 Remember if you are choosing the left and top property way object should be wrapped in a canvas.