拖拽的实现

实现效果:左键自定义控件上的树节点,将信息拖拽到主窗体的文本框中

自定义控件: ----拖拽源

.cs中

View Code
private void OnPreviewListBoxMouseMove(object sender, MouseEventArgs e)
{
Point pos = e.GetPosition(leftDataTree); //获取mListBox位置
HitTestResult result = VisualTreeHelper.HitTest(leftDataTree, pos); //获取mListBox信息
TreeViewItem listBoxItem = Utils.FindVisualParent<TreeViewItem>(result.VisualHit); //找到实际要拖拽的
if (listBoxItem == null || listBoxItem.DataContext != leftDataTree.SelectedItem || !(leftDataTree.SelectedItem is DataTreeModel))
return;
if (((DataTreeModel)listBoxItem.DataContext).Parent == null)
return;
#region 复制效果
//DragDropAdorner adorner = new DragDropAdorner(listBoxItem);
//mAdornerLayer = AdornerLayer.GetAdornerLayer(mTopLevelGrid);
//mAdornerLayer.Add(adorner);
#endregion

DataTreeModel dataItem = listBoxItem.DataContext as DataTreeModel;
DataObject dataObject = new DataObject(dataItem);
System.Windows.DragDrop.DoDragDrop(leftDataTree, dataObject, DragDropEffects.Copy);

//mAdornerLayer.Remove(adorner); //复制完后删除效果
}
View Code
    internal static class Utils
    {
        /// <summary>
        /// 复制
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static T FindVisualParent<T>(DependencyObject obj) where T : class
        {
            while (obj != null)
            {
                if (obj is T)
                    return obj as T;
                obj = VisualTreeHelper.GetParent(obj);
            }
            return null;
        }
    }

.xaml中

  <TreeView Height="700"  HorizontalAlignment="Left" x:Name="leftDataTree"  
                  VerticalAlignment="Top" Width="200" ItemsSource="{Binding DataTreeNode}" SelectedItemChanged="leftDataTree_SelectedItemChanged" >

主窗体:  ----接收数据

.cs中

View Code
        private void OnDragOver(object sender, DragEventArgs e)
        {
            e.Handled = true;
            e.Effects = DragDropEffects.Copy; 
        }

.xaml中

   <TextBox Name="txtinfo" TextWrapping="Wrap" AllowDrop="True" PreviewDragOver="OnDragOver"/>

最后你会发现,其实拖拽源和接收数据是分开的,两个独立的功能块。用起来很爽。(但是有些第三方控件不支持拖拽,坑爹啊)

原文地址:https://www.cnblogs.com/pingping/p/2593496.html