Search code examples
c#wpfvisual-studiodrag-and-droptreeview

WPF Drag&Drop - 3 Treeview


I'm trying to make drag and drop items betwen 3 treeviews. Every tree source is defined by the same class.

public class TreeItem : TreeViewItemBase
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string SubstringedName { get; set; }
    public string Link { get; set; }
    public bool IsChecked { get; set; }

    public TreeItem Parent { get; set; }

    public bool IsSingle { get; set; }

    public List<TreeItem> TreeItems { get; set; }
}

But i have no idea how to pass data between this 3 trees... This what i have for now:

private void tree_view_current_slides_Drop(object sender, DragEventArgs e)
    {
        MessageBox.Show("YEY");
    }

    private void tree_view_current_slides_PreviewMouseMove(object sender, MouseEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed ||
    e.RightButton == MouseButtonState.Pressed && !_IsDragging)
        {
            Point position = e.GetPosition(null);
            if (Math.Abs(position.X - _startPoint.X) >
                    SystemParameters.MinimumHorizontalDragDistance ||
                Math.Abs(position.Y - _startPoint.Y) >
                    SystemParameters.MinimumVerticalDragDistance)
            {
                StartDrag(e);
            }
        }
    }

    private void tree_view_current_slides_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        _startPoint = e.GetPosition(null);
    }

    private void StartDrag(MouseEventArgs e)
    {
        _IsDragging = true;
        object temp = this.tree_view_current_slides.SelectedItem;
        DataObject data = null;

        data = new DataObject("inadt", temp);

        if (data != null)
        {
            DragDropEffects dde = DragDropEffects.Move;
            if (e.RightButton == MouseButtonState.Pressed)
            {
                dde = DragDropEffects.All;
            }
            DragDropEffects de = DragDrop.DoDragDrop(this.tree_view_current_slides, data, dde);
        }
        _IsDragging = false;
    }

I just need an idea of how to get the data from one tree to another and where it was dropped


Solution

  • Here is my demo for you which refer to Drag Drop between Two TreeViews.

    The XAMl code is:

     <StackPanel>
            <TreeView AllowDrop="True" Drop="OnDrop">
                <local:DragableTreeViewItem Header="Employee1">
                    <local:DragableTreeViewItem Header="Jesper"/>
                    <local:DragableTreeViewItem Header="Aaberg"/>
                    <local:DragableTreeViewItem Header="12345"/>
                </local:DragableTreeViewItem>
                <local:DragableTreeViewItem Header="Employee2">
                    <local:DragableTreeViewItem Header="Dominik"/>
                    <local:DragableTreeViewItem Header="Paiha"/>
                    <local:DragableTreeViewItem Header="98765"/>
                </local:DragableTreeViewItem>
            </TreeView>
    
            <TreeView AllowDrop="True" Drop="OnDrop">
                <local:DragableTreeViewItem Header="Employee3">
                    <local:DragableTreeViewItem Header="Jesper3"/>
                    <local:DragableTreeViewItem Header="Aaberg3"/>
                    <local:DragableTreeViewItem Header="123453"/>
                </local:DragableTreeViewItem>
                <local:DragableTreeViewItem Header="Employee4">
                    <local:DragableTreeViewItem Header="Dominik4"/>
                    <local:DragableTreeViewItem Header="Paiha4"/>
                    <local:DragableTreeViewItem Header="987654"/>
                </local:DragableTreeViewItem>
            </TreeView>
        </StackPanel>
    

    Its cs code is:

    public void OnDrop(object sender, DragEventArgs e)
        {
            if (e.Data.GetData("DragableTreeViewItem") != null)
            {
                var item = e.Data.GetData("DragableTreeViewItem") as DragableTreeViewItem;
                DragableTreeViewItem newItem = new DragableTreeViewItem();
                newItem.Header = item.Header;
                foreach (var child in item.Items)
                    newItem.Items.Add(child);
            }
        }
    

    Code for DragableTreeViewItem.cs is:

    public class DragableTreeViewItem : TreeViewItem
    {
        public DragableTreeViewItem()
        {
            this.Drop += (sender, e) =>
            {
                if (e.Data.GetData("DragableTreeViewItem") != null)
                    ((DragableTreeViewItem)e.Data.GetData("DragableTreeViewItem")).SetParent(sender);
            };
        }
    
        public void SetParent(object newParent)
        {
            if (Parent is TreeView)
                ((TreeView)Parent).Items.Remove(this);
            if (Parent is DragableTreeViewItem)
                ((DragableTreeViewItem)Parent).Items.Remove(this);
    
            if (newParent is TreeView)
                ((TreeView)newParent).Items.Add(this);
            if (newParent is DragableTreeViewItem)
                ((DragableTreeViewItem)newParent).Items.Add(this);
        }
    
        protected override void OnMouseMove(System.Windows.Input.MouseEventArgs e)
        {
            if (e.LeftButton == System.Windows.Input.MouseButtonState.Pressed)
                DragDrop.DoDragDrop(this.Parent, new DataObject("DragableTreeViewItem", this, true), DragDropEffects.Move);
    
            base.OnMouseMove(e);
        }
    }