5

I got a Stackpanel containing many buttons, so how can I reorder my buttons by draging & droping them like Expression Blend or "Visual Studio Xaml Window Designer" does

enter image description here

S3ddi9
  • 2,121
  • 2
  • 20
  • 34
  • hey there check this out: http://stackoverflow.com/questions/4003802/moving-listboxitem-up-down-in-wpf – MUG4N Sep 28 '12 at 19:21
  • Can you tell us what you've tried, show some code perhaps, and tell us why those approaches didn't work and what the specific problem was? – Jeroen Oct 01 '12 at 05:20
  • Refer the following links http://www.codeproject.com/Articles/81105/How-to-Drag-and-Drop-between-ListBox-using-Silverl http://stackoverflow.com/questions/4851541/listbox-drag-reorder-index-of-the-dropped-item – Kumar Oct 01 '12 at 05:16

2 Answers2

5

This thread provides some useful information. Nevertheless, there are a lot of resources that you can find in by searching which would provide a lot of information on this.

Damian Schenkelman
  • 3,505
  • 1
  • 15
  • 19
-2

I am developing an arrangeable stack panel, when I touch or press the item and release the mouse and move the object or child in the stack panel is stick with it. my Code is as below.

namespace Controls.ArrangableGrid
{
    using System;
    using System.Linq;
    using System.Windows;
    using System.Windows.Input;
    using System.ComponentModel;   
    using System.Windows.Controls;    
        
    using System.Windows.Media;
    using System.Windows.Documents;

     public class ArrangableControl : StackPanel
    {
        #region -   Variables   -

        private bool _isDown;
        private bool _isDragging;

        private Point _startPoint;
        private DragAdorner _adorner;
        private UIElement _draggedItem = null;
        private int _draggedItemIndex = -1;

        private ILoggingService _logging = null;
        private ILogger _logger;

        private CypherComponentModel _parentComponent = null;

        #endregion

        public ArrangableControl()
        {
            Orientation = Orientation.Horizontal;
            Background = Brushes.Transparent;

            if (!DesignerProperties.GetIsInDesignMode(this))
            {
                Loaded += OnLoaded;
            }
        }

        #region -   Functions   -

        private void SetEvetns()
        {
                AllowDrop = true;

                Drop += OnDrop;
                
                StylusDown += OnEventDown;
                StylusUp += OnEventUp;
                StylusMove += OnEventMove;

                MouseLeftButtonDown += OnEventDown;
                MouseLeftButtonUp += OnEventUp;
                MouseMove += OnEventMove;                
        }

        private Point GetPosition(InputEventArgs e, IInputElement obj)
        {
            if (e is MouseEventArgs)
            {
                Mouse.Capture(obj);
                return (e as MouseEventArgs).GetPosition(obj);
            }                
            else if (e is TouchEventArgs)
            {
                (e as TouchEventArgs).TouchDevice.Capture(obj);
                return (e as TouchEventArgs).GetTouchPoint(obj).Position;
            }                
            else if (e is StylusEventArgs)
            {
                Stylus.Capture(obj);
                return (e as StylusEventArgs).GetPosition(obj);
            }
            return new Point();
        }

        private void DragStarted()
        {
            if (_draggedItem == null) return;

            _isDragging = true;

            _adorner = new DragAdorner(_draggedItem);
            var layer = AdornerLayer.GetAdornerLayer(_draggedItem);

            layer.Add(_adorner);
        }

        private void DragMoved()
        {
            var currentPosition = Mouse.GetPosition(this);

            _adorner.LeftOffset = currentPosition.X - _startPoint.X;
            _adorner.TopOffset = currentPosition.Y - _startPoint.Y;
        }

        private void DragFinished(bool cancelled, InputEventArgs e)
        {
            this.ReleaseMouseCapture();

            if (null != _adorner)
                AdornerLayer.GetAdornerLayer(_adorner.AdornedElement).Remove(_adorner);

            if (cancelled == false)
            {
                UIElement _dropItem = this.GetChildElement(GetPosition(e, this)) as UIElement;
                if (null != _dropItem)
                    DragDrop.DoDragDrop(_draggedItem, new DataObject("UIElement", e.Source, true), DragDropEffects.Move);
            }
            _adorner = null;
            _isDragging = false;
            _isDown = false;
        }

        #endregion

        #region -   Events   -

        private void OnLoaded(object sender, RoutedEventArgs e)
        {
            if (this.IsLoaded)
            {
                SetEvetns();
            }
        }        

        private void OnEventDown(object sender, InputEventArgs e)
        {
            if(e.Source != this)
            {
                _isDown = true;
                _isDragging = false;

                _startPoint = GetPosition(e, this);
                _draggedItem = e.Source as UIElement;

                if (null != _draggedItem)
                    _draggedItemIndex = this.Children.IndexOf(_draggedItem);
            }
        }

        private void OnEventUp(object sender, InputEventArgs e)
        {
            if (_isDown && _isDragging)
            {
                DragFinished(false, e);
                e.Handled = true;
            }
            else
            {
                e.Handled = true;

                ReleaseMouseCapture();
                ReleaseAllTouchCaptures();
                ReleaseStylusCapture();
            }
        }

        private void OnEventMove(object sender, InputEventArgs e)
        {
            if (_isDown)
            {
                if ((_isDragging == false) &&
                    ((Math.Abs(GetPosition(e, this).X - _startPoint.X) > SystemParameters.MinimumHorizontalDragDistance) ||
                     (Math.Abs(GetPosition(e, this).Y - _startPoint.Y) > SystemParameters.MinimumVerticalDragDistance)))
                    DragStarted();
                if (_isDragging)
                    DragMoved();
            }

            e.Handled = true;
        }

        private void OnDrop(object sender, DragEventArgs e)
        {
            try
            {
                UIElement droptarget = e.Source as UIElement;
                int droptargetIndex = this.Children.IndexOf(droptarget);

                if (_draggedItem != null && (droptargetIndex != _draggedItemIndex))
                {
                    if (droptargetIndex != -1)
                    {
                        this.Children.Remove(_draggedItem);
                        this.Children.Insert(droptargetIndex, _draggedItem);
                    }
                }
                _draggedItem = null;
                _draggedItemIndex = -1;
            }
            catch (Exception ex)
            {
                _logger.Error($"Drop Error: {ex} at {nameof(ArrangableControl)}");
            }
            finally
            {
                e.Handled = true;

                ReleaseMouseCapture();
                ReleaseAllTouchCaptures();
                ReleaseStylusCapture();
            }            
        }

        #endregion
    }
}
  • Seems like a question – D J May 11 '22 at 05:06
  • If you have a new question, please ask it by clicking the [Ask Question](https://stackoverflow.com/questions/ask) button. Include a link to this question if it helps provide context. - [From Review](/review/late-answers/31740268) – Kuro Neko May 14 '22 at 08:12