Click here to Skip to main content
15,885,175 members
Articles / Desktop Programming / WPF

WPF Drag-and-Drop Smorgasbord

Rate me:
Please Sign up or sign in to vote.
4.97/5 (64 votes)
10 Jun 2009CPOL19 min read 391.7K   10.8K   172  
This article presents a framework that supports Drag-and-Drop between TreeView, TabControl, ListBox, ToolBar and Canvas controls with custom cursors and adorners.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Threading;

using WpfDragAndDropSmorgasbord.DragDropFramework;
using WpfDragAndDropSmorgasbord.DragDropFrameworkData;



namespace WpfDragAndDropSmorgasbord
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        // The StringBuffers are used for testing and debug
        public StringBuilder buf0 = new StringBuilder("");
        public StringBuilder buf1 = new StringBuilder("");

        public Window1() {

            InitializeComponent();

            // Used by TabControl, TreeView and ListBox.
            // This data consumer allows items to be created
            // from a file or files dragged from Windows Explorer.
            FileDropConsumer fileDropDataConsumer =
                new FileDropConsumer(new string[] {
                    "FileDrop",
                    "FileNameW",
                });

            #region T A B   C O N T R O L
            // Data Provider
            TabControlDataProvider<TabControl, TabItem> tabControlDataProvider =
                new TabControlDataProvider<TabControl, TabItem>("TabItemObject");

            // Data Consumer
            TabControlDataConsumer<TabControl, TabItem> tabControlDataConsumer =
                new TabControlDataConsumer<TabControl, TabItem>(new string[] {"TabItemObject"});

            // Drag Managers
            DragManager dragHelperTabControl0 = new DragManager(this.docTabControl0, tabControlDataProvider);
            DragManager dragHelperTabControl1 = new DragManager(this.docTabControl1, tabControlDataProvider);

            // Drop Managers
            DropManager dropHelperTabControl0 = new DropManager(this.docTabControl0,
                new IDataConsumer[] {
                    tabControlDataConsumer,
                    fileDropDataConsumer
                });
            DropManager dropHelperTabControl1 = new DropManager(this.docTabControl1,
                new IDataConsumer[] {
                    tabControlDataConsumer,
                    fileDropDataConsumer
                });
            #endregion

            #region T R E E   V I E W
            // Data Provider
            TreeViewDataProvider<ItemsControl, TreeViewItem> treeViewDataProvider =
                new TreeViewDataProvider<ItemsControl, TreeViewItem>("TreeViewItemObject");

            // Data Consumer
            TreeViewDataConsumer<ItemsControl, TreeViewItem> treeViewDataConsumer =
                new TreeViewDataConsumer<ItemsControl, TreeViewItem>(new string[] {"TreeViewItemObject"});

            // Data Consumer of ListBoxItems
            ListBoxItemToTreeViewItem<ListBox, ListBoxItem> listBoxItemToTreeViewItem =
                new ListBoxItemToTreeViewItem<ListBox, ListBoxItem>(new string[] {"ListBoxItemObject"});

            // Drag Managers
            DragManager dragHelperTreeView0 = new DragManager(this.treeView0, treeViewDataProvider);
            DragManager dragHelperTreeView1 = new DragManager(this.treeView1, treeViewDataProvider);

            // Drop Managers
            DropManager dropHelperTreeView0 = new DropManager(this.treeView0,
                new IDataConsumer[] {
                    treeViewDataConsumer,
                    listBoxItemToTreeViewItem,
                    fileDropDataConsumer,
                });
            DropManager dropHelperTreeView1 = new DropManager(this.treeView1,
                new IDataConsumer[] {
                    treeViewDataConsumer,
                    listBoxItemToTreeViewItem,
                    fileDropDataConsumer,
                });
            #endregion

            #region L I S T   B O X
            // Data Provider
            ListBoxDataProvider<ListBox, ListBoxItem> listBoxDataProvider =
                new ListBoxDataProvider<ListBox, ListBoxItem>("ListBoxItemObject");

            // Data Consumer
            ListBoxDataConsumer<ListBox, ListBoxItem> listBoxDataConsumer =
                new ListBoxDataConsumer<ListBox, ListBoxItem>(new string[] {"ListBoxItemObject"});

            // Data Consumer of TreeViewItems
            TreeViewItemToListBoxItem<ItemsControl, TreeViewItem> treeViewItemToListBoxItem =
                new TreeViewItemToListBoxItem<ItemsControl, TreeViewItem>(new string[] {"TreeViewItemObject"});

            // Drag Managers
            DragManager dragHelperListBox0 = new DragManager(this.listBox0, listBoxDataProvider);
            DragManager dragHelperListBox1 = new DragManager(this.listBox1, listBoxDataProvider);

            // Drop Managers
            DropManager dropHelperListBox0 = new DropManager(this.listBox0,
                new IDataConsumer[] {
                    listBoxDataConsumer,
                    treeViewItemToListBoxItem,
                    fileDropDataConsumer,
                });
            DropManager dropHelperListBox1 = new DropManager(this.listBox1,
                new IDataConsumer[] {
                    listBoxDataConsumer,
                    treeViewItemToListBoxItem,
                    fileDropDataConsumer,
                });
            #endregion

            #region T R A S H
            // Data Consumer
            TrashConsumer trashConsumer = new TrashConsumer(new string[] {
                "TabItemObject",
                "TreeViewItemObject",
                "ListBoxItemObject",
                "CanvasTextBlockObject",
                "CanvasRectangleObject",
                "CanvasButtonObject",
                "ToolbarButtonObject",
            });

            // Drop Manager
            DropManager dropHelperListBoxItemTrash = new DropManager(this.trash, trashConsumer);
            #endregion

            #region C A N V A S
            // Data Providers/Consumers
            CanvasDataProvider<Canvas, TextBlock> canvasTextBlockDataProvider =
                new CanvasDataProvider<Canvas, TextBlock>("CanvasTextBlockObject");

            CanvasDataConsumer<Canvas, TextBlock> canvasTextBlockDataConsumer =
                new CanvasDataConsumer<Canvas, TextBlock>(new string[] {"CanvasTextBlockObject"});

            CanvasDataProvider<Canvas, Rectangle> canvasRectangleDataProvider =
                new CanvasDataProvider<Canvas, Rectangle>("CanvasRectangleObject");

            CanvasDataConsumer<Canvas, Rectangle> canvasRectangleDataConsumer =
                new CanvasDataConsumer<Canvas, Rectangle>(new string[] {"CanvasRectangleObject"});

            CanvasDataProvider<Canvas, Button> canvasButtonDataProvider =
                new CanvasDataProvider<Canvas, Button>("CanvasButtonObject");

            CanvasDataConsumer<Canvas, Button> canvasButtonDataConsumer =
                new CanvasDataConsumer<Canvas, Button>(new string[] {"CanvasButtonObject"});

            // Data Consumer of Toolbar Buttons
            ToolbarButtonToCanvasButton<ToolBar, Button> toolbarButtonToCanvasButton =
                new ToolbarButtonToCanvasButton<ToolBar, Button>(new string[] {"ToolbarButtonObject"});

            // Data consumer of System.Strings (creates a TextBlock)
            StringToCanvasTextBlock systemStringToCanvasTextBlock =
                new StringToCanvasTextBlock(new string[] { "System.String" });

            // Drag Managers
            DragManager dragHelperCanvas0 = new DragManager(this.canvas0,
                new IDataProvider[] {
                    canvasTextBlockDataProvider,
                    canvasRectangleDataProvider,
                    canvasButtonDataProvider,
                });
            DragManager dragHelperCanvas1 = new DragManager(this.canvas1,
                new IDataProvider[] {
                    canvasTextBlockDataProvider,
                    canvasRectangleDataProvider,
                    canvasButtonDataProvider,
                });

            // Drop Managers
            DropManager dropHelperCanvas0 = new DropManager(this.canvas0,
                new IDataConsumer[] {
                    canvasTextBlockDataConsumer,
                    canvasRectangleDataConsumer,
                    canvasButtonDataConsumer,
                    toolbarButtonToCanvasButton,
                    systemStringToCanvasTextBlock,
                });
            DropManager dropHelperCanvas1 = new DropManager(this.canvas1,
                new IDataConsumer[] {
                    canvasTextBlockDataConsumer,
                    canvasRectangleDataConsumer,
                    canvasButtonDataConsumer,
                    toolbarButtonToCanvasButton,
                    systemStringToCanvasTextBlock,
                });
            #endregion

            #region T O O L B A R
            // Data Provider
            ToolBarDataProvider<ToolBar, Button> toolBarButtonDataProvider =
                new ToolBarDataProvider<ToolBar, Button>("ToolbarButtonObject");

            // Data Consumer
            ToolBarDataConsumer<ToolBar, Button> toolBarButtonDataConsumer =
                new ToolBarDataConsumer<ToolBar, Button>(new string[] {"ToolbarButtonObject"});

            // Data Consumer of Canvas Buttons
            CanvasButtonToToolbarButton<Canvas, Button> canvasButtonToToolbarButton =
                new CanvasButtonToToolbarButton<Canvas, Button>(new string[] {"CanvasButtonObject"});

            // Drag Managers
            DragManager dragHelperToolBar0 = new DragManager(this.toolBar0,
                new IDataProvider[] {
                    toolBarButtonDataProvider,
                });
            DragManager dragHelperToolBar1 = new DragManager(this.toolBar1,
                new IDataProvider[] {
                    toolBarButtonDataProvider,
                });

            // Drop Managers
            DropManager dropHelperToolBar0 = new DropManager(this.toolBar0,
                new IDataConsumer[] {
                    toolBarButtonDataConsumer,
                    canvasButtonToToolbarButton,
                });
            DropManager dropHelperToolBar1 = new DropManager(this.toolBar1,
                new IDataConsumer[] {
                    toolBarButtonDataConsumer,
                    canvasButtonToToolbarButton,
                });
            #endregion
        }
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior)
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions