WPF详解拖拽功能

一 官网说明

拖放事件

拖放操作中有两类事件:一类是拖放操作的当前目标上发生的事件,一类是拖放操作的源上发生的事件。 若要执行拖放操作,必须处理这些事件。 通过使用这些事件的事件参数中的可用信息,可以轻松地实现拖放操作。

当前拖放目标上的事件

下表显示在拖放操作的当前目标上发生的事件。

鼠标事件描述
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;
               
            }
}
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值