对于拖放操作有两个方面:源和目标。为了创建拖放源,需要在某个位置调用DragDrop.DoDragDrop()方法初始化拖放操作。此时确定拖动操作的源,搁置希望移动的内容,并指明充许什么样的拖放效果(复制,移动等)。
通常会在响应PreviewMouseDown或MouseDown事件时,调用DoDragDrop()方法。
而接收的元素需要将它的AllowDrop属性设置为true,还需要通过处理Drop事件来处理数据。
前台代码:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBox Name="source" Grid.Row="0" Background="Purple" Foreground="White" MouseDown="source_MouseDown">博客园:www.cnblogs.com</TextBox>
<Image Source="http://static.cnblogs.com/images/logo_small.gif" Grid.Column="1" Stretch="None" MouseDown="Image_MouseDown"></Image>
<Label Name="target" Grid.Row="1" Background="YellowGreen" AllowDrop="True" Drop="OnDrop">文本拖到这里</Label>
<Image Name="targetImg" Grid.Row="1" Grid.Column="1" AllowDrop="True" Drop="targetImg_Drop_1" Stretch="None" Source="http://www.baidu.com/img/baidu_sylogo1.gif"></Image>
</Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBox Name="source" Grid.Row="0" Background="Purple" Foreground="White" MouseDown="source_MouseDown">博客园:www.cnblogs.com</TextBox>
<Image Source="http://static.cnblogs.com/images/logo_small.gif" Grid.Column="1" Stretch="None" MouseDown="Image_MouseDown"></Image>
<Label Name="target" Grid.Row="1" Background="YellowGreen" AllowDrop="True" Drop="OnDrop">文本拖到这里</Label>
<Image Name="targetImg" Grid.Row="1" Grid.Column="1" AllowDrop="True" Drop="targetImg_Drop_1" Stretch="None" Source="http://www.baidu.com/img/baidu_sylogo1.gif"></Image>
</Grid>
后台代码:
/// <summary>
/// 文本源数据
/// </summary>
private void source_MouseDown(object sender, MouseButtonEventArgs e)
{
TextBox objText = sender as TextBox;
DragDrop.DoDragDrop(objText, objText, DragDropEffects.Copy);
}
/// <summary>
/// 图片源数据
/// </summary>
private void Image_MouseDown(object sender, MouseButtonEventArgs e)
{
Image objImage = sender as Image;
DragDrop.DoDragDrop(objImage, objImage.Source, DragDropEffects.Copy);
}
/// <summary>
/// 目标位置
/// </summary>
private void OnDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.Text))
e.Effects = DragDropEffects.Copy;
else
return;
this.target.Content = e.Data.GetData(DataFormats.Text);
}
private void targetImg_Drop_1(object sender, DragEventArgs e)
{
e.Data.GetFormats();
if (e.Data.GetDataPresent("System.Windows.Media.Imaging.BitmapFrameDecode"))
e.Effects = DragDropEffects.Copy;
else
{
return;
}
// targetImg.Source = (ImageSource)e.Data.GetData("System.Windows.Media.Imaging.BitmapFrameDecode");
((Image)sender).Source = (ImageSource)e.Data.GetData("System.Windows.Media.Imaging.BitmapFrameDecode");
}
/// 文本源数据
/// </summary>
private void source_MouseDown(object sender, MouseButtonEventArgs e)
{
TextBox objText = sender as TextBox;
DragDrop.DoDragDrop(objText, objText, DragDropEffects.Copy);
}
/// <summary>
/// 图片源数据
/// </summary>
private void Image_MouseDown(object sender, MouseButtonEventArgs e)
{
Image objImage = sender as Image;
DragDrop.DoDragDrop(objImage, objImage.Source, DragDropEffects.Copy);
}
/// <summary>
/// 目标位置
/// </summary>
private void OnDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.Text))
e.Effects = DragDropEffects.Copy;
else
return;
this.target.Content = e.Data.GetData(DataFormats.Text);
}
private void targetImg_Drop_1(object sender, DragEventArgs e)
{
e.Data.GetFormats();
if (e.Data.GetDataPresent("System.Windows.Media.Imaging.BitmapFrameDecode"))
e.Effects = DragDropEffects.Copy;
else
{
return;
}
// targetImg.Source = (ImageSource)e.Data.GetData("System.Windows.Media.Imaging.BitmapFrameDecode");
((Image)sender).Source = (ImageSource)e.Data.GetData("System.Windows.Media.Imaging.BitmapFrameDecode");
}
如果不知道拖放源数据是什么数据类型,可以使用实现了IDataObject接口的GetFormats()方法。如: e.Data.GetFormats(); 其中Data就实现了IDataObject接口。