Pour simplifier, je vais laisser les trucs glisser-déplacer puisque cette question semble principalement sur l'aspect de clonage.
L'outil requis est la classe DataTemplate
. Vous placez dans un dictionnaire de ressources l'ensemble des éléments que vous souhaitez cloner chacun d'eux dans un DataTemplate
. Vous pouvez utiliser ContentPresenter
pour afficher les occurrences de ces éléments dans le panneau de pile de gauche. Vous pouvez ensuite utiliser le code pour créer des instances du contenu du modèle et les placer dans un Canvas
sur la droite.
Exemple.
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);
}
}
Cela montre à l'aide d'un ContentPresenter
pour afficher votre rectangle. Au lieu du glisser-déposer (pour lequel il existe de nombreux exemples d'ailleurs), ce code crée simplement un clone du rectangle où l'utilisateur clique dans le canevas.