/// <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); } }
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; } } } }