Exemple #1
0
        /* ----------------------------------------------------------------- */
        ///
        /// 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));
        }
Exemple #2
0
 /* ----------------------------------------------------------------- */
 ///
 /// OnMoving
 ///
 /// <summary>
 /// Moving イベントを発生させます。
 /// </summary>
 ///
 /* ----------------------------------------------------------------- */
 protected virtual void OnMoving(MoveCancelEventArgs e)
 => Moving?.Invoke(this, e);