/* ----------------------------------------------------------------- */ /// /// MoveItems /// /// <summary> /// 項目を移動します。 /// </summary> /// /// <remarks> /// offset が正の数の場合は後ろに、負の数の場合は前に移動します。 /// </remarks> /// /* ----------------------------------------------------------------- */ public void MoveItems(IEnumerable <int> indices, int offset) { if (offset == 0) { return; } var args = new MoveCancelEventArgs(indices.ToArray(), offset); OnMoving(args); if (args.Cancel || VirtualMode) { return; } var sorted = offset > 0 ? indices.OrderByDescending(x => x) : indices.OrderBy(x => x); foreach (var index in sorted) { if (index < 0 || index >= Count) { continue; } var item = Items[index]; var selected = item.Selected; var focused = item.Focused; Items.RemoveAt(index); var newindex = Math.Max(Math.Min(index + offset, Count), 0); var result = Items.Insert(newindex, item); if (result != null) { result.Selected = selected; result.Focused = focused; } } HackAlignmentBug(); OnMoved(new MoveEventArgs(indices.ToArray(), offset)); }
/* ----------------------------------------------------------------- */ /// /// OnMoving /// /// <summary> /// Moving イベントを発生させます。 /// </summary> /// /* ----------------------------------------------------------------- */ protected virtual void OnMoving(MoveCancelEventArgs e) => Moving?.Invoke(this, e);