一 官网说明
拖放事件
拖放操作中有两类事件:一类是拖放操作的当前目标上发生的事件,一类是拖放操作的源上发生的事件。 若要执行拖放操作,必须处理这些事件。 通过使用这些事件的事件参数中的可用信息,可以轻松地实现拖放操作。
当前拖放目标上的事件
下表显示在拖放操作的当前目标上发生的事件。
鼠标事件 | 描述 |
---|---|
DragEnter | 将对象拖入控件的边界时此事件发生。 此事件的处理程序接收类型为 DragEventArgs 的参数. |
DragOver | 在鼠标指针位于控件的边界内时如果拖动对象则此事件发生。 此事件的处理程序接收类型为 DragEventArgs 的参数。 |
DragDrop | 拖放操作完成时此事件发生。 此事件的处理程序接收类型为 DragEventArgs 的参数。 |
DragLeave | 将对象拖出控件的边界时此事件发生。 此事件的处理程序接收类型为 EventArgs 的参数。 |
DragEventArgs 类提供鼠标指针的位置、鼠标按钮和键盘修改键的当前状态、正在拖动的数据以及 DragDropEffects 值(指定拖动事件的源所允许的操作以及操作的目标放置效果)。
放置源上的事件
下表显示在拖放操作的源上发生的事件
鼠标事件 | 描述 |
---|---|
GiveFeedback | 此事件在执行拖动操作期间发生。 借助此事件,可向用户提供可视提示(例如更改鼠标指针),通知拖放操作正在发生。 此事件的处理程序接收类型为 GiveFeedbackEventArgs 的参数。 |
QueryContinueDrag | 此事件在拖放操作期间引发,并使拖动源可以确定是否应取消拖放操作。 此事件的处理程序接收类型为 QueryContinueDragEventArgs 的参数。 |
QueryContinueDragEventArgs 类提供鼠标按钮和键盘修改键的当前状态、指定是否按 ESC 键的值以及 DragAction 值(可设置为指定是否应继续拖放操作)。
执行拖放操作
拖放操作始终涉及两个组件 - 放置源和拖放目标 。 若要启动拖放操作,请指定一个控件作为源,并处理 MouseDown 事件。 在事件处理程序中,调用 DoDragDrop 方法,该方法提供与放置关联的数据和 DragDropEffects 值。
将目标控件的 AllowDrop 属性设置为 true,以允许该控件接受拖放操作。 目标处理两个事件,第一个是响应控件上的拖动的事件,如 DragOver。 第二个事件是放置操作本身 - DragDrop。
二 示例
源
XAML文件
<TreeView x:Name="AtomService_TreeView"
MouseMove="TreeView_MouseMove"
MouseDown="TreeView_MouseDown" >
C#文件
private Point lastMouseDownPoint = new Point();
/// <summary>
/// 鼠标移动获得选择项目,发送拖拽
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TreeView_MouseMove(object sender, MouseEventArgs e)
{
Location draggedTVItem;
TreeView TV = sender as TreeView;
try
{
if (e.LeftButton == MouseButtonState.Pressed)
{
Point currentPosition = e.GetPosition(TV);
if ((Math.Abs(currentPosition.X - lastMouseDownPoint.X) > 10.0) ||
(Math.Abs(currentPosition.Y - lastMouseDownPoint.Y) > 10.0))
{
///获取拖拽项目
draggedTVItem = (Location)TV.SelectedItem;
if (draggedTVItem != null)
{
DragDropEffects finalDropEffect = DragDrop.DoDragDrop(TV, draggedTVItem.Name, DragDropEffects.Move);
}
}
}
}
catch (Exception en)
{
ExceptionHandler.Handle(en);
}
}
/// <summary>
/// 按下鼠标 获得鼠标位置
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TreeView_MouseDown(object sender, MouseButtonEventArgs e)
{
TreeView TV = sender as TreeView;
if (e.ChangedButton == MouseButton.Left)
{
lastMouseDownPoint = e.GetPosition(TV);
}
}
目标
XAML文件
<TreeView x:FieldModifier="public" x:Name="tvAsset" Height="400" HorizontalAlignment="Left" VerticalAlignment="Top" Width="170"
PreviewMouseRightButtonDown="tvAsset_PreviewMouseRightButtonDown"
AllowDrop="True"
DragEnter="TheTreeView_CheckDropTarget"
DragLeave="TheTreeView_CheckDropTarget"
DragOver="TheTreeView_CheckDropTarget"
Drop="TheTreeView_Drop"
>
C#文件
/// <summary>
/// 拖拽目的
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TheTreeView_Drop(object sender, DragEventArgs e)
{
int targetItem = 0;
e.Effects = DragDropEffects.None;
e.Handled = true;
string ss = e.Data.GetData(DataFormats.Text).ToString();
// Verify that this is a valid drop and then store the drop target
TreeView tv = sender as TreeView;
var cell = UIHelpers.TryFindFromPoint<TreeViewItem>((UIElement)sender, e.GetPosition(tv));
if (cell != null)
{
TreeViewItem tvc = cell as TreeViewItem;
}
}