Есть приложение, которое позволяет перетаскивать картинки из левой панели в правую, как реализовать драг&дроп внутри canvas? что бы картинку которую я уже перетащил можно было мышкой перемещать по экрану:
XML |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| <Window x:Class="WpfApplication16.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="600" Width="800" WindowStartupLocation="CenterScreen" WindowStyle="ToolWindow">
<Grid>
<DockPanel Background="AntiqueWhite">
<ListBox Background="Gray" Width="184">
<ListBox.Resources>
<Style TargetType="{x:Type Image}">
<Setter Property="Width" Value="100"/>
<Setter Property="Height" Value="100"/>
<EventSetter Event="MouseLeftButtonDown" Handler="DragImage"/>
</Style>
</ListBox.Resources>
<ListBoxItem/>
<TextBlock Background="White" FontSize="25" Width="170"> Пол </TextBlock>
<ComboBox Width="171">
<ComboBoxItem>
<Image Source="E:\cont\floor\1.jpg" />
</ComboBoxItem>
</ComboBox>
<TextBlock Background="White" FontSize="25" Width="170"><Run Text="Стулья"/></TextBlock>
<ComboBox Width="171">
<ComboBoxItem>
<Image Source="1.jpg" />
</ComboBoxItem>
</ComboBox>
<TextBlock Background="White" FontSize="25" Width="170"><Run Text="Столы"/></TextBlock>
<ComboBox Width="171">
<ComboBoxItem>
<Image Source="1.jpg" />
</ComboBoxItem>
</ComboBox>
<TextBlock Background="White" FontSize="25" Width="170"><Run Text="Шкафы"/></TextBlock>
<ComboBox Width="171">
<ComboBoxItem>
<Image Source="1.jpg" />
</ComboBoxItem>
</ComboBox>
</ListBox>
<Canvas x:Name="Canvas"
MouseLeftButtonDown="Canvas_MouseLeftButtonDown_1" MouseMove="Canvas_MouseMove_1" MouseLeftButtonUp="Canvas_MouseLeftButtonUp_1"
AllowDrop="True" Background="AntiqueWhite" Drop="DropImage"/>
</DockPanel>
</Grid>
</Window> |
|
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
| using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApplication16
{
/// <summary>
/// Логика взаимодействия для MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
bool isMouseCaptured;
double mouseVerticalPosition;
double mouseHorizontalPosition;
public MainWindow()
{
InitializeComponent();
}
private void Canvas_MouseLeftButtonDown_1(object sender, MouseButtonEventArgs args)
{
Image item = sender as Image;
mouseVerticalPosition = args.GetPosition(null).Y;
mouseHorizontalPosition = args.GetPosition(null).X;
isMouseCaptured = true;
item.CaptureMouse();
}
private void Canvas_MouseMove_1(object sender, MouseEventArgs args)
{
Image item = sender as Image;
if (isMouseCaptured)
{
//расчет текущей позиции
double deltaV = args.GetPosition(null).Y - mouseVerticalPosition;
double deltaH = args.GetPosition(null).X - mouseHorizontalPosition;
double newTop = deltaV + (double)item.GetValue(Canvas.TopProperty);
double newLeft = deltaH + (double)item.GetValue(Canvas.LeftProperty);
//передача значения новой позиции объекту
item.SetValue(Canvas.TopProperty, newTop);
item.SetValue(Canvas.LeftProperty, newLeft);
//обновление глобального значения позиции
mouseVerticalPosition = args.GetPosition(null).Y;
mouseHorizontalPosition = args.GetPosition(null).X;
}
}
private void Canvas_MouseLeftButtonUp_1(object sender, MouseButtonEventArgs args)
{
Image item = sender as Image;
isMouseCaptured = false;
item.ReleaseMouseCapture();
mouseVerticalPosition = -1;
mouseHorizontalPosition = -1;
}
private void DragImage(object sender, MouseButtonEventArgs e)
{
Image image = e.Source as Image;
DataObject data = new DataObject(typeof(ImageSource), image.Source);
DragDrop.DoDragDrop(image, data, DragDropEffects.Copy);
}
private void DropImage(object sender, DragEventArgs e)
{
ImageSource image = e.Data.GetData(typeof(ImageSource)) as ImageSource;
Image imageControl = new Image() { Width = image.Width, Height = image.Height, Source = image };
Canvas.SetLeft(imageControl, e.GetPosition(this.Canvas).X);
Canvas.SetTop(imageControl, e.GetPosition(this.Canvas).Y);
this.Canvas.Children.Add(imageControl);
}
}
} |
|
Если кому нужно прикрепил проект целиком. И по возможности, как мне портировать на Siverlight проект? Что нужно учесть? И что не будет/будет работать