/// <summary>ドラッグ操作継続イベント</summary>
        /// <param name="sender">ListBoxItem</param>
        /// <param name="e">ドラッグ操作継続イベントデータ</param>
        private static void OnQueryContinueDrag(object sender, QueryContinueDragEventArgs e)
        {
            if (sender is ListBoxItem listBoxItem &&
                _Ghost != null)
            {
                var window = FrameworkElementInfo.FindAncestor <Window>(listBoxItem);

                _Ghost.Offset = MouseInfo.GetClientPosition(window);
            }
        }
Exemple #2
0
    public void RegisterElement(FrameworkElement element, Boolean registerOnly)
    {
        FrameworkElementInfo info = new FrameworkElementInfo();

        if (!registerOnly)
        {
            info.Position = CalculatePosition(element);
        }
        info.FrameworkElement = element;
        _elements.Add(info);
    }
        /// <summary>マウス操作イベント</summary>
        /// <param name="sender">ListBoxItem</param>
        /// <param name="e">マウスイベントデータ</param>
        private void OnPreviewMouseMove(object sender, MouseEventArgs e)
        {
            if (sender is ListBoxItem listBoxItem &&
                listBoxItem == _SelectedListBoxItem &&
                e.LeftButton == MouseButtonState.Pressed &&
                _Ghost == null)
            {
                var position = e.GetPosition(listBoxItem);

                if (Math.Abs(position.X - _DragStartPosition.X) > SystemParameters.MinimumHorizontalDragDistance ||
                    Math.Abs(position.Y - _DragStartPosition.Y) > SystemParameters.MinimumVerticalDragDistance)
                {
                    // ListBoxItemを持つListBoxを取得
                    var listBox = FrameworkElementInfo.FindAncestor <ListBox>(listBoxItem);

                    if (listBox != null)
                    {
                        listBox.AllowDrop = true;

                        // ゴースト生成
                        _Ghost = new GhostListBoxAdorner(listBox, listBoxItem, 1.0, _DragStartPosition);

                        // レイヤにゴースト追加
                        var layer = AdornerLayer.GetAdornerLayer(listBox);
                        layer.Add(_Ghost);

                        // Drag&Dropを開始してゴーストを表示
                        // ここからドラッグ操作が終了するまでOnQueryContinueDrag()が実行される
                        DragDrop.DoDragDrop(listBoxItem, listBoxItem, DragDropEffects.Move);

                        // レイヤからゴーストを削除して初期化
                        layer.Remove(_Ghost);

                        _Ghost = null;
                        _SelectedListBoxItem = null;

                        listBox.AllowDrop = false;
                    }
                }
            }
        }