tags:

views:

23

answers:

1

I am designing a silverlight application in which i will have a rectangle control at the left side, when i click the rectangel and drag a copy of the rectangle control should be created and dragged and dropped in to the page.

Please can anyone help me with the code

A: 

For simplicity I'm going to leave out the Drag-Drop stuff since this question seems mainly about the cloning aspect.

The tool needed is the DataTemplate class. You place in a resource dictionary the set of items you want to clone each enclosed in a DataTemplate. You can use ContentPresenter to display instances of these items in say stack panel on the left. You can then use code to create instances of the template content and place them in say a Canvas on the right.

Example.

Xaml:-

<UserControl x:Class="SilverlightApplication1.CloningStuff"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  >
    <UserControl.Resources>
        <DataTemplate x:Key="Rectangle">
            <Rectangle Stroke="Blue" StrokeThickness="3" Fill="CornflowerBlue" Width="100" Height="75" />
        </DataTemplate>
    </UserControl.Resources>
  <Grid x:Name="LayoutRoot" Background="White">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <StackPanel>
            <ContentPresenter x:Name="Rectangle" ContentTemplate="{StaticResource Rectangle}" />
        </StackPanel>
        <Canvas x:Name="Surface" MouseLeftButtonDown="Surface_MouseLeftButtonDown" Grid.Column="1" Background="Wheat">

        </Canvas>
    </Grid>
</UserControl>

Code:-

public partial class CloningStuff : UserControl
{
    public CloningStuff()
    {
        InitializeComponent();
    }

    private void Surface_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        Canvas target = (Canvas)sender;
        Point p = e.GetPosition(target);

        Rectangle r = (Rectangle)((DataTemplate)Resources["Rectangle"]).LoadContent();
        Canvas.SetLeft(r, p.X);
        Canvas.SetTop(r, p.Y);

        target.Children.Add(r);

    }
}

This shows using a ContentPresenter to display your rectangle. In place of drag-dropping (for which there are plenty of examples of elsewhere) this code just creates a Clone of the rectangle whereever the user clicks in the Canvas.

AnthonyWJones