拖动WPF弹出控件

WPF Popup控件很不错,但在我看来有些局限。 有没有办法在打开时“拖动”弹出窗口(就像使用Windows的DragMove()方法一样)?

这可以在没有大问题的情况下完成,还是我必须自己编写弹出类的替代品? 谢谢

这是使用Thumb的简单解决方案。

  • XAML中的子类Popup和代码隐藏
  • 添加一个宽度/高度设置为0的拇指(这也可以在XAML中完成)
  • 在Popup上侦听MouseDown事件,并在Thumb上引发相同的事件
  • 在DragDelta上移动弹出窗口

XAML:

    

C#:

 public partial class DraggablePopup : Popup { public DraggablePopup() { var thumb = new Thumb { Width = 0, Height = 0, }; ContentCanvas.Children.Add(thumb); MouseDown += (sender, e) => { thumb.RaiseEvent(e); }; thumb.DragDelta += (sender, e) => { HorizontalOffset += e.HorizontalChange; VerticalOffset += e.VerticalChange; }; } } 

PopUp没有DragMove。 只是一个小小的工作,你可以添加很多改进。

    

在后面的代码中,添加此mousemove事件

  pop.MouseMove += new MouseEventHandler(pop_MouseMove); void pop_MouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { pop.PlacementRectangle = new Rect(new Point(e.GetPosition(this).X, e.GetPosition(this).Y),new Point(200,200)); } } 

实现此目的的另一种方法是将Popup的位置设置为MousePoint。 这使弹出窗口最初出现在鼠标光标的位置。

然后,您可以使用Thumb或MouseMove事件来设置Popup的Horizo​​ntalOffset和VerticalOffset。 当用户拖动Popup时,这些属性会将Popup从其原始位置移开。

记得将Horizo​​ntalOffset和VerticalOffset重置为零,以便下次使用弹出窗口!

移动太快时松动鼠标的问题可以解决


这取自msdn:

新窗口包含Popup的Child内容。

Popup控件将其Child内容的引用维护为逻辑子项。 创建新窗口时,Popup的内容将成为窗口的可视子项,并且仍然是Popup的逻辑子项。 相反,Popup仍然是其子内容的逻辑父级。


换句话说,弹出窗口的子项显示在独立窗口中。

所以当尝试以下内容时:
Popup.CaptureMouse()捕获包装器窗口而不是弹出窗口本身。 而是使用Popup.Child.CaptureMouse()捕获实际的弹出窗口。

所有其他事件都应该使用Popup.Child注册。

Popup.Child.MouseMovePopup.Child.LostCapture

这已经过测试,效果非常好

 Private Point startPoint; private void Window_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { startPoint = e.GetPosition(null); } private void Window_MouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { Point relative = e.GetPosition(null); Point AbsolutePos = new Point(relative.X + this.Left, relative.Y + this.Top); this.Top = AbsolutePos.Y - startPoint.Y; this.Left = AbsolutePos.X - startPoint.X; } } 

这适用于拖动我的窗口,但就像它被告知如果我将鼠标移动到快速,它将离开窗口并停止提升事件。 没有提到拖拽根本不顺利。 有谁知道如何正确地做,漂亮和平滑的拖动,而不是在拖得太快时失去它??? 如果可能的话,发布一个简单的例子,而不是整个教程,这会让像我这样的初学者在代码中丢失。 谢谢!