private void ControlLocationChanged(object sender, EventArgs e) { ListPanelItem movingControl = sender as ListPanelItem; if (movingControl == null || !movingControl.Moving) { return; } IOrderedEnumerable <Control> SortedControls = Panel.Controls.OfType <Control>().OrderBy(control => control.Top); Panel.SuspendLayout(); foreach (Control control in SortedControls) { if (control == movingControl) { continue; } int controlMiddle = control.Top + (control.Height / 2); if (control.Top < _snapToTop) { if (controlMiddle > movingControl.Top) { if (control.Top < _snapToTop) { _snapToTop = control.Top; } control.Top += (movingControl.Height + movingControl.Margin.Bottom); } } else if (control.Top > _snapToTop + movingControl.Height) { if (controlMiddle < movingControl.Bottom) { control.Top = _snapToTop; _snapToTop = control.Bottom + control.Margin.Bottom + movingControl.Margin.Top; } } } Panel.ResumeLayout(); }
private void AddItem(object item) { ListPanelItem control = new ListPanelItem(item); control.Expand(); control.Icon = _itemIcon; control.Left = control.Margin.Left; control.Top = btnAdd.Top - btnAdd.Margin.Top + control.Margin.Top; control.Width = Panel.Width - control.Margin.Horizontal; control.StartMove += ControlStartingMove; control.EndMove += ControlEndMove; control.LocationChanging += ControlLocationChanging; control.LocationChanged += ControlLocationChanged; control.SizeChanged += ControlSizeChanged; control.PropertyChanged += ControlPropertyChanged; Panel.Controls.Add(control); control.Focus(); }