Для простоты я собираюсь пропустить материал Drag-Drop, так как этот вопрос кажется в основном касающимся аспекта клонирования.
Необходимым инструментом является класс DataTemplate
. Вы помещаете в словарь ресурсов набор элементов, каждый из которых вы хотите клонировать, заключенный в DataTemplate
. Вы можете использовать ContentPresenter
для отображения экземпляров этих предметов, скажем, на панели стека слева. Затем вы можете использовать код для создания экземпляров содержимого шаблона и поместить их, скажем, Canvas
справа.
Пример.
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>
Код: -
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);
}
}
Это показывает использование ContentPresenter
для отображения вашего прямоугольника. Вместо перетаскивания (для которого есть множество других примеров), этот код просто создает клон прямоугольника, куда бы пользователь ни щелкнул в Canvas.