Exemplo n.º 1
0
        private void treeView_PreviewMouseMove(object sender, MouseEventArgs e)
        {
            var item = (Item)treeView.SelectedItem;

            if (item != null && item is InstanceItem && item != NoneItem && e.LeftButton == MouseButtonState.Pressed)
            {
                Vector offset = e.GetPosition(null) - dragStart;

                // Start drag if mouse was held for a minimum distance
                if (Math.Abs(offset.X) > SystemParameters.MinimumHorizontalDragDistance ||
                    Math.Abs(offset.Y) > SystemParameters.MinimumVerticalDragDistance)
                {
                    // Allow dropping anywhere within the window
                    Window mainWindow = Application.Current.MainWindow;
                    mainWindow.AllowDrop = true;

                    // Create item ghost
                    var template  = new DataTemplate(typeof(InstanceItem));
                    var textBlock = new FrameworkElementFactory(typeof(TextBlock));
                    textBlock.SetBinding(TextBlock.TextProperty, new Binding("DisplayName"));
                    template.VisualTree = textBlock;
                    var adornedElement = (UIElement)mainWindow.Content;
                    var adornerLayer   = AdornerLayer.GetAdornerLayer(adornedElement);
                    dragAdorner = new DragAdorner(item, template, adornedElement, adornerLayer);

                    mainWindow.PreviewDragOver += MainWindow_PreviewDragOver;

                    // Perform drag and drop
                    DataObject data = new DataObject(typeof(InstanceItem), item);
                    DragDrop.DoDragDrop(treeView, data, DragDropEffects.Move);

                    // Cleanup handlers
                    mainWindow.PreviewDragOver -= MainWindow_PreviewDragOver;
                    dragAdorner.Detach();
                    mainWindow.AllowDrop = false;
                }
            }
        }