Как разместить окно рекламного окна рядом с указателем мыши при перетаскивании в wpf - PullRequest
0 голосов
/ 29 августа 2018

У меня есть перетаскивание с поддержкой Adorner. При перетаскивании элемента списка справа налево окно обожателя находится не рядом с указателем мыши. Пожалуйста, кто-нибудь, помогите мне разместить окно рекламщика рядом с указателем мыши. Я следовал за созданием окна рекламодателя и отображением рекламодателя, используя приведенный ниже вопрос Пожалуйста, обратитесь к вопросу . Я попробовал вот так, чтобы разместить окно рекламодателя рядом с указателем мыши. Но это не работает для более высокого разрешения окна, я не получил никакого правильного решения. Пожалуйста, предложите вашу идею.

Поведение

private Window _dragdropWindow = null;
ListBoxItem draggedItem = null;
Win32Point w32Mouse = new Win32Point();      

this.AssociatedObject.PreviewMouseMove += (sender, e) =>
{
   if (e.LeftButton == MouseButtonState.Pressed && dataObject != null && !IsDragging)
   {
      var currentPoint = e.GetPosition(sender as UIElement);
      if (Math.Abs(currentPoint.X - startingPoint.X) > 10 || (Math.Abs(currentPoint.Y - startingPoint.Y) > 10))
      {
         IsDragging = true;

         if (draggedItem != null)
         {
            CreateDragDropWindow(draggedItem);
         }

         DragDrop.DoDragDrop(sender as ListBox, dataObject, DragDropEffects.Copy);

         if (_dragdropWindow != null)
         {
            _dragdropWindow.Close();
            _dragdropWindow = null;
         }
      }
   }    
};


this.AssociatedObject.PreviewMouseLeftButtonDown += (sender, e) =>
{
   var listBoxItem = VisualHelper.FindParentOfType(e.OriginalSource as DependencyObject, typeof(ListBoxItem)) as ListBoxItem;
   if (listBoxItem != null)
   {
      startingPoint = e.GetPosition(sender as UIElement);
      dataObject = listBoxItem.DataContext as Details;                                       
      draggedItem = VisualHelper.FindParentOfType(e.OriginalSource as DependencyObject, typeof(ListBoxItem)) as ListBoxItem;
   }
   else
   {
      dataObject = null;
      IsDragging = false;
   }
};

this.AssociatedObject.PreviewGiveFeedback += (sender, e) =>
{
   Win32Point w32Mouse = new Win32Point();   
   GetCursorPos(ref w32Mouse);               

  _dragdropWindow.Left = w32Mouse.X;
  _dragdropWindow.Top = w32Mouse.Y;                
}; 

 private void CreateDragDropWindow(Visual dragElement)
 {
    this._dragdropWindow = new Window();
    _dragdropWindow.WindowStyle = WindowStyle.None;
    _dragdropWindow.AllowsTransparency = true;
    _dragdropWindow.AllowDrop = false;
    _dragdropWindow.Background = null;
    _dragdropWindow.IsHitTestVisible = false;
    _dragdropWindow.SizeToContent = SizeToContent.WidthAndHeight;
    _dragdropWindow.Topmost = true;
    _dragdropWindow.ShowInTaskbar = false;

    Rectangle rectangle = new Rectangle();
    rectangle.Width = ((FrameworkElement)dragElement).ActualWidth;
    rectangle.Height = ((FrameworkElement)dragElement).ActualHeight;
    rectangle.Fill = new VisualBrush(dragElement);
    this._dragdropWindow.Content = rectangle;           

    this._dragdropWindow.Left = w32Mouse.X;
    this._dragdropWindow.Top = w32Mouse.Y;
    this._dragdropWindow.Show();
 }


[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool GetCursorPos(ref Win32Point pt);

[StructLayout(LayoutKind.Sequential)]
internal struct Win32Point
{
   public Int32 X;
   public Int32 Y;
};

При перетаскивании элемента списка рекламодатель не находится рядом с указателем мыши Please refer the screenshot

...